题目:
https://pintia.cn/problem-sets/994805260223102976/problems/994805307551629312

输入第一行给出 3 个正整数,分别为:N(≤105),即考生总数;L(≥60),为录取最低分数线,即德分和才分均不低于 L 的考生才有资格被考虑录取;H(<100),为优先录取线

  1. 德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;
  2. 才分不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;
  3. 德才分均低于 H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;
  4. 其他达到最低线 L 的考生也按总分排序,但排在第三类考生之后。

随后 N 行,每行给出一位考生的信息,包括:准考证号 德分 才分,其中准考证号为 8 位整数,德才分为区间 [0, 100] 内的整数。数字间以空格分隔。

思路&&问题

多类别同时排序可以参考这题,几个注意点

  1. 结构体直接建立数组,不要使用vector
  2. 多类别的判断规则写清楚
  3. 有不输出元素的情况下,排序也要对整体排序

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. using namespace std;
  6. struct Person{
  7. char id[10];
  8. int deScore;
  9. int caiScore;
  10. int totalScore;
  11. int flag;
  12. }person[100010];
  13. int judge(Person A, int L, int H)
  14. {
  15. if(A.deScore < L||A.caiScore < L)return 5;
  16. else if(A.deScore >= H&&A.caiScore >= H)return 1;
  17. else if(A.deScore >= H&&A.caiScore < H) return 2;
  18. else if(A.deScore >= A.caiScore)return 3;
  19. else return 4;
  20. }
  21. bool cmp(Person A, Person B)
  22. {
  23. if(A.flag != B.flag) return A.flag < B.flag;
  24. else if (A.totalScore != B.totalScore)return A.totalScore > B.totalScore;
  25. else if (A.deScore != B.deScore) return A.deScore > B.deScore;
  26. else return strcmp(A.id,B.id)<0;
  27. }
  28. int main(){
  29. int N,L,H;
  30. scanf("%d %d %d", &N, &L, &H);
  31. for(int i = 0; i < N; i++)
  32. {
  33. scanf("%s %d %d", person[i].id, &person[i].deScore, &person[i].caiScore);
  34. person[i].totalScore = person[i].caiScore + person[i].deScore;
  35. person[i].flag = judge(person[i],L,H);
  36. }
  37. int count = 0;
  38. for(int i = 0; i < N;i++)
  39. {
  40. if (person[i].flag!=5)
  41. {
  42. count++;
  43. }
  44. }
  45. sort(person,person+N,cmp);
  46. cout<<count<<endl;
  47. for(int i = 0; i < count;i++)
  48. {
  49. printf("%s %d %d\n",person[i].id,person[i].deScore,person[i].caiScore);
  50. }
  51. }