PAT05:德才论

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)