题目:
我国的高考志愿投档是严格按照高考分数从高到低的顺序排列,排列的规则如下:
首先按照总分降序排列;
当总分相同时,再按照语文分数降序排序;
当语文分数也相同时,再按照数学分数降序排序;
当数学分数也相同时,再按照英语分数降序排序。
所有分数都相同时,再按照录入的顺序排列。
这样,每个考生的位序都是唯一的。
现在给定n(10≤n≤1000)个人的有关信息,按照上述规则排序之后,输出最前面的m(1≤m≤n)个人的序号。
输入:
10 5
73 71 72
68 70 63
74 78 63
73 66 68
61 61 61
63 79 79
70 71 76
69 61 61
71 62 66
78 69 64
输出:
6 7 1 3 10
解题思路:
这题难点就在于如何实现分数的排序 ,我们当然可以像C一样开个for循环一个一个去比,但是那也太麻烦了点,这里介绍lambda函数使用方法。
这里定义一个函数名custom_sort函数,先确定排序方式然后在lambda函数中调用它,具体源码如下:
def custom_sort(student):
return (-sum(student), -student[0], -student[1], -student[2])
n, m = map(int, input().split())
scores = []
for i in range(n):
score = list(map(int, input().split()))
scores.append((i + 1, score))
sorted_scores = sorted(scores, key=lambda x: custom_sort(x[1]))
for i in range(m):
print(sorted_scores[i][0], end=" ")
或者也可以这么写
def custom_sort(student):
return (sum(student), student[0], student[1], student[2])
n, m = map(int, input().split())
scores = []
for i in range(n):
score = list(map(int, input().split()))
scores.append((i + 1, score))
sorted_scores = sorted(scores, key=lambda x: custom_sort(x[1]), reverse=True)
for i in range(m):
print(sorted_scores[i][0], end=" ")