1.在结构体里面设置total_grades属性是明智之举,但是不可以在结构体内得到total_grades=virtue_grade+talent_grade;
2.弄清题意,对人进行分类,等级越高type值越小,但是注意分的类别也许出现交叉的情况,细的要出现在粗的之后
3.尤其注意要被淘汰的选手,一旦淘汰要直接进入下一轮循环,否则可能因为type被覆盖而被误捞回来。例如:60分的最低分,有人v=90,t=50,本该淘汰,却可能被接下来的判断认为是君子
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;const int maxn = 100010;struct person{char id[10] = "";int virtue_grade = 0;int talent_grade = 0;int total_grades = 0;int type = 0;//属于哪类人,虽然我不喜欢把人分类 }pers[maxn];bool cmp(person a,person b){if(a.type!=b.type)return a.type<b.type; else if(a.total_grades!=b.total_grades) return a.total_grades>b.total_grades;else if(a.virtue_grade!=b.virtue_grade)return a.virtue_grade>b.virtue_grade;else if(a.talent_grade!=b.talent_grade)return a.talent_grade>b.talent_grade;else return strcmp(a.id,b.id)<0;
}
// v,t >= H 圣人 0
// t<H v>=H 君子 1
// v,t<=H v>=t 愚人 2
// v,t>=L 3
// v<L or t<L 不录 4 int main(){int n,L,H;scanf("%d %d %d",&n,&L,&H);int idx = 0;char now_id[10] = "";int v = 0;int t = 0;int now_type = 5;while(n--){scanf("%s %d %d",now_id,&v,&t);if(v<L||t<L){now_type = 4;continue;//4可能被3,2,1覆盖掉,很危险,一定要跳出循环 }if(v>=L&&t>=L)now_type = 3;//可能被 2 1 0 覆盖掉 if(v<=H&&t<=H&&v>=t)now_type = 2;if(t<H&&v>=H)now_type = 1;if(v>=H&&t>=H)now_type = 0;if(now_type!=4){strcpy(pers[idx].id,now_id);pers[idx].virtue_grade = v;pers[idx].talent_grade = t;pers[idx].total_grades = v+t;pers[idx].type = now_type;idx ++;}}printf("%d\n",idx);sort(pers,pers+idx,cmp);for(int i=0;i<idx;i++){printf("%s %d %d\n",pers[i].id,pers[i].virtue_grade,pers[i].talent_grade);}return 0;
}