PAT B1015/A1062 德才论
Time Limit: 200ms Memory Limit:65636 KB
题目描述
宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,
才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而
与之,与其得小人,不若得愚人”。
现给出一批考生的“德才”分数,请根据司马光的“德才论”给出录取排名。
输入格式
第1行给出3个正整数,分别为:N(≤10)——考生总数;L(≥60)——录取最低分
数线,即德分和才分均不低于L的考生才有资格被考虑录取;H(<100)——优先录取线——
德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分
不到但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第1类考生之后:德才分
均低于H,但是德分不低于才分的考生属于“才德兼亡”但尚有“德胜才”者,按总分排序,
但排在第2类考生之后;其他达到最低线L的考生也按总分排序,但排在第3类考生之后。
随后N行,每行给出一位考生的信息,包括准考证号、德分及才分,其中准考证号为8
位整数,德才分为[0,100]内的整数。数字间以空格分隔。
输出格式
第1行首先给出达到最低分数线的考生人数M;随后M行,每行按照输入格式输出一位
考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按
其德分降序排列;若德分也并列,则按准考证号的升序输出。
题意
给出n个考生的准考证号、德分、才分以及及格线L、优秀线H,然后对这n个考生进
行分类:
①
如果德分和才分中有一个低于L,则为不及格生,即为第5类,且设下面4类均及格。
②
如果德分和才分均不低于H,则为第1类。
③
如果德分不低于H,才分低于H,则为第2类。
④
如果德分和才分均低于H但德分不低于才分,则为第3类。
⑤
剩余为第4类。
对这n个考生按下面的规则排序:
①先按类别从小到大排序。
②类别相同的,按总分从大到小排序。
③总分相同的,按德分从大到小排序。
④德分相同的,按准考证号从小到大排序。
最后输出所有及格生的信息,顺序为排完序后的顺序。
注意点
①由于第4类包含的情况多,因此把第4类考生放在最后鉴别,这样可以减少代码量,否则,如果直接按1~5的类别顺序进行归类就会比较麻烦。
②由于数据量比较大,因此使用cin跟cout容易出现“运行超时”错误,应使用scanf和printf。
#include<cstdio> #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;//类级低的在前 } if (a.sum != b.sum) { return a.sum > b.sum;//类级相同,总分高的在前 } if (a.de != b.de) { return a.de > b.de;//总分相同,德分高的在前 } else { return strcmp(a.id, b.id) < 0;//德分相同,准考证号低的在前 } } int main() { int n,L,H;//L为优秀先线,H为及格线 scanf("%d%d%d", &n,&L,&H); int m = n; 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].cai + stu[i].de; if (stu[i].de < L || stu[i].cai < L) { stu[i].flag = 5; m--; } 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 < H && stu[i].cai < H && 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; }

浙公网安备 33010602011771号