每日一题12005-奖学金

1.题目详情

某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前5名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分)是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是279(总分等于输入的语文、数学、英语三科成绩之和),但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理,不能得分。
每日一题12005-奖学金

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]

上一篇:python3使用RabbitMQ


下一篇:LeetCode 279 完全平方数