1.题目详情
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理,不能得分。
2.解题思路
如何将成绩由大到小排序?
最后输出:一开始列表的索引+成绩,如何保留原列表索引呢?
(还未解决Orz
3.代码实现
#快速排序
def partition(li,left,right):
tmp = li[left]
while left < right:
while left < right and li[right] >= tmp:
right -= 1
li[left] = li[right]
while left < right and li[left] <= tmp:
left += 1
li[right] = li[left]
li[left] = tmp
return left
def quick_sort(li,left,right):
if left < right:
mid = partition(li,left,right)
quick_sort(li,left,mid-1)
quick_sort(li,mid+1,right)
n = int(input()) #n个数据
arr = []
for i in range(n):
stu = input().split()
stu[0] = int(stu[0])
stu[1] = int(stu[1])
stu[2] = int(stu[2])
total = stu[0] + stu[1] + stu[2]
arr.append(total)
# print(arr)
quick_sort(arr,0,len(arr)-1)
new_arr = arr[::-1] #由大到小
h = 0
for j in range(5):
print(h,new_arr[j])
h += 1 #这个索引不对!!
#语文成绩判断stu[0]就好了,关键是索引问题没解决
# for j in range(5):
# index = 0
# for k in range(0,len(arr)):
# if new_arr[j] == arr[index]:
# print(index+1,new_arr[j])
# break
# else:
# index += 1
4.知识点
有两个列表,能够在新列表中获取原列表的索引。又复习了一遍快速排序,注意排序完事升序,若想获得降序,用列表中[::-1]