5.德才论
题目
题目描述
1 2 3 4
| 宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之 小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。” 现给出一批考生的德才分数,请根据司马光的理论给出录取排名。
|
输入描述:
1 2 3 4 5 6
| 输入第1行给出3个正整数,分别为:N(<=105),即考生总数;L(>=60),为录取最低分数线,即德分和才分均不低于L的考生才有资格 被考虑录取;H(<100),为优先录取线——德分和才分均不低于此线的被定义为“才德全尽”,此类考生按德才总分从高到低排序;才分不到 但德分到线的一类考生属于“德胜才”,也按总分排序,但排在第一类考生之后;德才分均低于H,但是德分不低于才分的考生属于“才德兼 亡”但尚有“德胜才”者,按总分排序,但排在第二类考生之后;其他达到最低线L的考生也按总分排序,但排在第三类考生之后。
随后N行,每行给出一位考生的信息,包括:准考证号、德分、才分,其中准考证号为8位整数,德才分为区间[0, 100]内的整数。数字间以空格分隔。
|
输出描述:
1 2
| 输出第1行首先给出达到最低分数线的考生人数M,随后M行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人 总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
|
题解
分类
首先,参加排序的考生需要高于最低分数线,在此基础上分为四类:
1、德、才均高于优先录取线
2、德高于优先录取线
3、德、才均低于优先录取线,但德 > 才
4、德、才均低于优先录取线,但德 < 才
排序
将所有满足条件的考生分类完成,逐类排序。排序规则是:按总分排序,总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。
输出
按照输出格式,进行打印。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| import sys
inputs = []
out1 = [] out2 = [] out3 = [] out4 = []
for line in sys.stdin: inputs.append([int(item) for item in line.split()]) if len(inputs) == inputs[0][0] + 1: break
low_score = inputs[0][1]
high_score = inputs[0][2]
for i in range(1,len(inputs)): total = inputs[i][1] + inputs[i][2] if inputs[i][1] >= high_score and inputs[i][2] >= high_score: out1.append(inputs[i]) elif inputs[i][1] >= high_score and low_score <= inputs[i][2] < high_score: out2.append(inputs[i]) elif inputs[i][1] >= low_score and inputs[i][2] >= low_score and inputs[i][1] >= inputs[i][2]: out3.append(inputs[i]) elif inputs[i][1] >= low_score and inputs[i][2] >= low_score: out4.append(inputs[i])
out = [out1,out2,out3,out4] res = [] for i,lst in enumerate(out): lst = sorted(lst,key=lambda x:(x[1]+x[2],x[1],-x[0]),reverse=True) res += lst
print(len(res)) for lst in res: print(*lst,sep=' ')
|
知识点
多条排序规则
sorted()
函数在排序时,会针对列表 lst
中的每个元素 x
调用 key
参数指定的函数(此处为 lambda x: (x[1] + x[2], x[1], -x[0])
),得到相应的排序键。key
参数的作用是定义一个映射规则,将待排序的元素转化为一个用于排序的值(排序键)。sorted()
函数根据这些排序键进行排序,从而实现对原始元素列表的定制化排序。
1
| lst = sorted(lst,key=lambda x:(x[1]+x[2],x[1],-x[0]),reverse=True)
|