题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805307551629312
思路借鉴:《算法笔记 上级训练实战指南》
这道题两个地方需要思路清晰。
1.德才分类
⑤低于最低线:德<L 才<L
①才德全尽:德>H 才>H
②德胜才:德>=才
③才德兼亡&&德胜才:德>才>L
④其他 德>L 才>L
2.cmp函数
然后我出现的问题在于
1.sort函数范围限定成M,导致并不是所有人参加了排序
2.第三类人的判断:德胜才也包含德=才,更改之后通过测试点2、3、4
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 using namespace std; 5 typedef struct{ 6 char id[10]; 7 int de,cai,sum; 8 int flag; 9 }stu; 10 stu s[100010]; 11 bool cmp(stu a,stu b){ 12 if(a.flag!=b.flag) return (a.flag<b.flag); 13 else if(a.sum!=b.sum) return (a.sum>b.sum); 14 else if(a.de!=b.de) return (a.de>b.de); 15 else return strcmp(a.id,b.id)<0; 16 } 17 18 int main(){ 19 int N,L,H; 20 scanf("%d %d %d",&N,&L,&H); 21 int m=N; 22 for(int i=0;i<N;i++){ 23 int de,cai; 24 scanf("%8s %d %d",s[i].id,&de,&cai); 25 s[i].de=de; 26 s[i].cai=cai; 27 s[i].sum=de+cai; 28 if(de<L||cai<L) { 29 s[i].flag=5; 30 m--; 31 } 32 else if(de>=H&&cai>=H) s[i].flag=1; 33 else if(de>=H&&cai<H) s[i].flag=2; 34 else if(de>=cai) s[i].flag=3; // 35 else s[i].flag=4; 36 } 37 sort(s,s+N,cmp);// 38 printf("%d",m); 39 for(int i=0;i<m;i++){ 40 printf("\n%s %d %d",s[i].id,s[i].de,s[i].cai); 41 } 42 return 0; 43 }