题目描述
射击比赛成绩统计
给定一个射击比赛成绩单
包含多个选手若干次射击的成绩分数
请对每个选手按其最高三个分数之和进行降序排名
输出降序排名后的选手ID序列
条件如下:
一个选手可以有多个射击成绩的分数 且次序不固定
如果一个选手成绩小于三个 则认为选手的所有成绩无效 排名忽略该选手
如果选手的成绩之和相等,则成绩相等的选手按照其ID降序排列
输入描述
输入第一行:一个整数 N
表示该场比赛总共进行了N次射击
产生N个成绩分数 2 <= N <= 100
输入第二行 一个长度为N的整数序列
表示参与本次射击的选手Id
0 <= ID <= 99
输入第三行是长度为N的整数序列
表示参与每次射击的选手对应的成绩
0 <= 成绩 <= 100
输出描述
符合题设条件的降序排名后的选手ID序列
示例一
输入
13
3,3,7,4,4,4,4,7,7,3,5,5,5
53,80,68,24,39,76,66,16,100,55,53,80,55
输出
5,3,7,4
说明
该场射击比赛进行了13次,参赛选手为3 4 5 7
3号选手的成绩为53 80 55最高三个成绩的和为 188
4号选手的成绩为24 39 76 66最高三个和为181
5号选手的成绩为53 80 55 最高三个和为188
7号选手成绩为68 16 100 最高三个和184
比较各个选手最高三个成绩的和
3 = 5 > 7 > 4
由于3和5成绩相等 且5 > 3 所以输出为5,3,7,4
代码实现
# coding:utf-8
import numpyclass Solution:def shotScore(self, k, id, score):s = dict()# 遍历射击成绩,将每个人的成绩存到字典s里,格式为s = {'ID':[score1、score2.....]}for i in range(len(id)):if id[i] in s.keys():m = s[id[i]]m.append(score[i])s[id[i]] = melse:m = list()m.append(score[i])s[id[i]] = m# 遍历字典S,对每个人的成绩进行排序for k, v in s.items():if len(v) < 3: # 成绩数少于3个的,成绩丢弃s.pop(k)else:v.sort(reverse=True) # 有效成绩由高到低排序sums = int(v[0]) + int(v[1]) + int(v[2]) # 对最高的三个分数求和,并替换掉当前字段valuev = sumss[k] = vres = sorted(s.items(), key=lambda x: (-x[1], -x[0])) # 字典按照值降序+key降序的方式重拍ret = []for i in range(len(res)):ret.append(res[i][0])return retif __name__ == '__main__':k = input("K:")ids = input("ids:")id = [int(i) for i in ids.split(',')]id = numpy.array(id)ss = input("score:")s = numpy.array([n for n in ss.split(',')])solution = Solution()print(solution.shotScore(k, id, s))