PTA L 2-009現金入り封筒(シミュレーション)

10638 ワード

タイトルリンク
タイトルの説明
誰もお年玉を奪ったことがないでしょう......ここではN N N人の間でお年玉を出したり、お年玉を奪ったりした記録を示しています.彼らがお年玉を奪った収穫を統計してください.
入力フォーマット
最初の行に入力すると、正の整数N N N N(N N N≦leq≦1 0 4 10^4 104)が与えられます.すなわち、お年玉と現金入り封筒の合計数に参加すると、これらの人は1 1 1 1からN番号になります.その後、N N N行、i行目はi番の人がお年玉を出す記録を与え、フォーマットは以下の通りである.
K K K N ​ 1 N_​1 N​​1 P 1 P_1 P1​⋯ N K N_K NK​ P K P_K PK​
このうちK K(0≦K 0leq K 0≦K≦K≦20leq 20≦20)は、お年玉の個数、N i N_i N iはお年玉を奪った人の番号で、P i P_iPi(>0)(>0)(>0)は、現金入り封筒の金額(分割単位)です.注意:同じ人が出したお年玉に対して、一人当たり最大1回しか奪うことができず、繰り返し奪うことはできません.
出力フォーマット
所得金額が高い順から低い順に各人の番号と所得金額(元単位で小数点以下2桁)を出力します.1人あたりの情報は1行で、2つの数字の間に1つのスペースがあります.収入金額が並んでいる場合は、現金入り封筒を奪った個数で出力を減らします.並列がある場合は、個人番号で出力を増やします.
入力サンプル
10
3 2 22 10 58 8 125
5 1 345 3 211 5 233 7 13 8 101
1 7 8800
2 1 1000 2 1000
2 4 250 10 320
6 5 11 9 22 8 33 7 44 10 55 4 2
1 3 8800
2 1 23 2 123
1 8 250
4 2 121 4 516 7 112 9 10
出力サンプル
1 11.63
2  3.63
8  3.63
3  2.11
7  1.69
6  -1.67
9  -2.18
10 -3.26
5  -3.26
4  -12.32
構想
タイトルを見ればわかりますが、構想はシミュレーションです.全過程をシミュレートし、問題の需要に応じて並べ替え基準を再定義すれば答えが得られるが、提出時にテストポイントw a waがあり、デバッグしても長い間原因が見つからず、最後に構造体のメンバーm o n e y money moneyとg e s h u geshu geshuが0 0に初期化されていないことが分かった.なぜ他のテストポイントが合格したのか.私も分からなかった.解決策は2種類ある
  • は、構造体を定義する際に、対応するメンバを0 0 0に初期化する.
  • は、構造体配列をグローバル変数として宣言する(グローバル変数は0 0に自動的に初期化される).

  • しかし、個人的には、後でコードを叩く過程で、構造体配列をグローバル変数として宣言する傾向があります.これにより、そんなに多くのことを考慮する必要がなく、グローバル変数の範囲を大きくすることができます.テーマが構造体配列の複数組入力を要求する場合は,入力前にmemsetまたはfull操作を行うことが望ましい.
    ACコード
    #include 
    #define INF 0x3f3f3f
    using namespace std;
    const int mod=1e9+7;
    const int Max_N=1e4+10;
    typedef pair<int,int>P;
    typedef long long ll;
    typedef unsigned long long ull;
    struct Num
    {
        int money;
        int geshu;
        int xuhao;
    };
    bool cmp(Num a,Num b)
    {
        if(a.money!=b.money)
            return  a.money>b.money;
        else if(a.geshu==b.geshu)
            return a.xuhao<b.xuhao;
        return a.geshu>b.geshu;
    }
    Num number[Max_N];
    int main(int argc, char const *argv[])
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            int k;
            cin>>k;
            ll res=0;
            for(int j=0;j<k;j++)
            {
                int a,b;
                cin>>a>>b;
                number[a].money+=b;
                res+=b;
                number[a].geshu++;
            }
            number[i].money-=res;
            number[i].xuhao=i;
        }
        sort(number+1,number+n+1,cmp);
        for(int i=1;i<=n;i++)
        {
            cout<<number[i].xuhao<<" ";
            printf("%.2lf
    "
    ,(double)number[i].money/100); } return 0; }

    まとめ
  • +=操作を行うときは条件反射を形成する、加算された数が最初に0 0に初期化するかどうかに自然に注目する
  • .
  • 構造体配列は、できるだけグローバル変数
  • として宣言する.
    ああ、自分が書いたブログは水の問題だと思います.