【PATによるC++とデータ構造の復習】PAT-B 1015.徳才論(25)-PAT乙級真題


これは乙級の本題ですが、私は長い間正しいことをしていました.柳が柳の神のコードを振り返って、知識の柔軟な運用の重要性をもっと意識しました.
タイトル
宋代の史学者司馬光は『資治通鑑』の中で有名な「徳才論」がある.現在、受験生の徳才点数を与えています.司馬光の理論に基づいて合格順位を与えてください.入力フォーマット:1行目に3つの正の整数を入力し、それぞれ:N(<=105)、すなわち受験生総数;L(>=60)は、最低点数ライン、すなわち徳点と才点がLを下回らない受験生を採用するために採用される資格がある.H(<100)は、優先合格ラインである徳点と才点がこのラインを下回らないものを「才徳全尽」と定義し、このような受験生は徳才総得点が高いものから低いものまで順位をつけている.才能が分からないが、徳分が線に着いた受験生は「徳勝才」に属し、総点順に並べられているが、第1類の受験生の後にランクされている.徳才点はいずれもHを下回っているが、徳点が才点を下回っていない受験生は「才徳兼亡」に属しているが、まだ「徳勝才」がある者は、総得点で順位をつけているが、第2類の受験生の後にランクされている.他の最低ラインLに達した受験生も総点順だったが、3番目の受験生の後だった.その後、N行は、各行に1人の受験生の情報を提供し、受験番号、徳分、才分を含み、そのうち受験番号は8桁の整数であり、徳才は区間[0,100]内の整数に分けられる.数字の間はスペースで区切られています.出力フォーマット:出力1行目はまず最低スコアラインに達した受験生数Mを与え、その後M行で、各行は入力フォーマットに従って1人の受験生の情報を出力し、受験生は入力で説明したルールに従って高から低までソートする.ある種類の受験生の中で複数の人が総得点を同時にしている場合、その徳分降順に並べます.徳分も並んでいれば、受験番号の昇順で出力されます.入力サンプル:14 60 80 1000001 64 10000000 90 10000000 90 10000001 85 10000003 85 85 801000004 80 85 1000005 82 1000006 83,076 1000007 90 78 1000008 75 10000009,5990 10000010,010,8845 10000012 80,10000013,9099 10000014,6660出力サンプル:12 10000013 90,9910000012,100,012 80,1000003 85,801,801000004 80,808080100000700006 83 76 10000005 82 77 10000002 90 60 10000014 66 60 10000008 75 79 10000001 64 90
ぶんせき
  • 私の考えは入力する時に出力する必要がある学生を4種類に分けて、このようにする原因は出力が完全に総得点に従って出力するのではなくて、異なる学生の重みが違います.
  • 肝心なのはやはりcmp比較関数の編纂で、必ず構想を整理しなければならない.
  • コードを書くとき、私はいつもコードがきれいではないと感じて、多くのコードは冗長を繰り返して、しかも4つの配列を開くとき、空間の複雑さが高すぎることを心配します.柳神を見た後の収穫はとても大きくて、彼女のコードの構想は私と同じで、しかしvectorを導入して、4つの10010空間の配列を開くことができなくて、次はforの内部で、ifの内部の関数の簡素化、すべて学ぶ価値があるので、後で私は私たち二人のコードを貼ります.

  • マイコード
    #include
    #include
    using namespace std;
    typedef struct student{
    	int ID;//   
    	int D_score;//   
    	int C_score;//   
    }student;
    student stu1[10010], stu2[10010],stu3[10010],stu4[10010];//         
    bool cmp(student a,student b){
    	if(a.C_score +a.D_score !=b.C_score +b.D_score ) return a.C_score +a.D_score >b.C_score +b.D_score;
    	else if(a.D_score !=b.D_score )return a.D_score >b.D_score;
    	else return a.ID =H&&C_score>=H){
    			stu1[s1].ID=ID;
    			stu1[s1].C_score =C_score;
    			stu1[s1].D_score =D_score;
    			++s1;
    			++num; 
    		}
    		else if(D_score>=H&&C_score>=L){
    			stu2[s2].ID=ID;
    			stu2[s2].C_score =C_score;
    			stu2[s2].D_score =D_score;
    			++s2;
    			++num; 
    		}
    		else if(D_score>=L&&C_score>=L&&D_score>=C_score){
    			stu3[s3].ID=ID;
    			stu3[s3].C_score =C_score;
    			stu3[s3].D_score =D_score;
    			++s3;
    			++num;
    		}
    		else if(D_score>=L&&C_score>=L){
    			stu4[s4].ID=ID;
    			stu4[s4].C_score =C_score;
    			stu4[s4].D_score =D_score;
    			++s4;
    			++num;
    		}
    		
    	} 
    	sort(stu1,stu1+s1+1,cmp);
    	sort(stu2,stu2+s2+1,cmp);
    	sort(stu3,stu3+s3+1,cmp);
    	sort(stu4,stu4+s4+1,cmp);
    	printf("%d
    ",num); for(int i=0;i

    柳神コード
    #include 
    #include 
    #include 
    using namespace std;
    struct node {
        int num, de, cai;
    };
    int cmp(struct node a, struct node b) {
        if ((a.de + a.cai) != (b.de + b.cai))
            return (a.de + a.cai) > (b.de + b.cai);
        else if (a.de != b.de)
            return a.de > b.de;
        else
            return a.num < b.num;
    }
    int main() {
        int n, low, high;
        scanf("%d %d %d", &n, &low, &high);
        vector v[4];
        node temp;
        int total = n;
        for (int i = 0; i < n; i++) {
            scanf("%d %d %d", &temp.num, &temp.de, &temp.cai);
            if (temp.de < low || temp.cai < low)
                total--;
            else if (temp.de >= high && temp.cai >= high)
                v[0].push_back(temp);
            else if (temp.de >= high && temp.cai < high)
                v[1].push_back(temp);
            else if (temp.de < high && temp.cai < high && temp.de >= temp.cai)
                v[2].push_back(temp);
            else
                v[3].push_back(temp);
        }
        printf("%d
    ", total); for (int i = 0; i < 4; i++) { sort(v[i].begin(), v[i].end(), cmp); for (int j = 0; j < v[i].size(); j++) printf("%d %d %d
    ", v[i][j].num, v[i][j].de, v[i][j].cai); } return 0; }