题目:
https://pintia.cn/problem-sets/994805260223102976/problems/994805307551629312
输入第一行给出 3 个正整数,分别为:N(≤105),即考生总数;L(≥60),为录取最低分数线,即德分和才分均不低于 L 的考生才有资格被考虑录取;H(<100),为优先录取线
- 德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;
- 才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;
- 德才分均低于 H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;
- 其他达到最低线 L 的考生也按总分排序,但排在第三类考生之后。
随后 N 行,每行给出一位考生的信息,包括:准考证号 德分 才分,其中准考证号为 8 位整数,德才分为区间 [0, 100] 内的整数。数字间以空格分隔。
思路&&问题
多类别同时排序可以参考这题,几个注意点
- 结构体直接建立数组,不要使用vector
- 多类别的判断规则写清楚
- 有不输出元素的情况下,排序也要对整体排序
代码
#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;struct Person{char id[10];int deScore;int caiScore;int totalScore;int flag;}person[100010];int judge(Person A, int L, int H){if(A.deScore < L||A.caiScore < L)return 5;else if(A.deScore >= H&&A.caiScore >= H)return 1;else if(A.deScore >= H&&A.caiScore < H) return 2;else if(A.deScore >= A.caiScore)return 3;else return 4;}bool cmp(Person A, Person B){if(A.flag != B.flag) return A.flag < B.flag;else if (A.totalScore != B.totalScore)return A.totalScore > B.totalScore;else if (A.deScore != B.deScore) return A.deScore > B.deScore;else return strcmp(A.id,B.id)<0;}int main(){int N,L,H;scanf("%d %d %d", &N, &L, &H);for(int i = 0; i < N; i++){scanf("%s %d %d", person[i].id, &person[i].deScore, &person[i].caiScore);person[i].totalScore = person[i].caiScore + person[i].deScore;person[i].flag = judge(person[i],L,H);}int count = 0;for(int i = 0; i < N;i++){if (person[i].flag!=5){count++;}}sort(person,person+N,cmp);cout<<count<<endl;for(int i = 0; i < count;i++){printf("%s %d %d\n",person[i].id,person[i].deScore,person[i].caiScore);}}
