题意:给出n个学生的准考证号、德分、才分以及及格线L、优秀线H,然后对这n个考生进行分类
1 如果德分和才分有一个低于L,则不及格,即第五类,且设下面4类均及格。
2 如果德分和才分均不低于H,则为第一类。
3 如果德分不低于H,才分低于H,则为第二类。
4 如果德分和才分均低于H但德分不低于才分,则为第三类。
5 剩余为第四类
对这n个考生按下面的规则排序:
1 先按类别从小到大排序
2 类别相同的 按总分从大到小排序。
3 总分相同的 按德分从大到小排序。
4 德分相同的 按准考证号从小到大排序。
最后输出所有及格生的信息,顺序为排完序后的顺序。
思路:
结构体存储学生信息。准考证号、德分、才分、总分以及类别。
对读入的学生进行分类,同时计算总分 及格人数。
使用sort排序 bmp函数按题意写。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct Student{ char id[10];//准考证号 int de,cai,sum;//德分,才分以及总分 int flag; }stu[100010]; bool cmp(Student a,Student b){ if(a.flag !=b.flag) return a.flag<b.flag;//类别小的在前面 else if(a.sum!=b.sum) return a.sum>b.sum;//按总分排 从大到小就是大于号 else if(a.de!=b.de) return a.de >b.de; else return strcmp(a.id,b.id)<0; } int main(){ int n,L,H; scanf("%d %d %d",&n,&L,&H); int m=n;//m及格人数 for(int i=0;i<n;i++){ scanf("%s%d%d",stu[i].id,&stu[i].de,&stu[i].cai); stu[i].sum = stu[i].de+stu[i].cai; if(stu[i].de<L||stu[i].cai<L){//先处理不及格的,设为第五类 stu[i].flag=5; m--;//及格人数减1 } else if(stu[i].de>=H&&stu[i].cai>=H) stu[i].flag=1; else if(stu[i].de>=H&&stu[i].cai<=H) stu[i].flag=2; else if(stu[i].de>=stu[i].cai) stu[i].flag=3; else stu[i].flag=4; } sort(stu,stu+n,cmp); printf("%d\n",m); for(int i=0;i<m;i++){ printf("%s %d %d\n",stu[i].id,stu[i].de,stu[i].cai); } return 0; }