题目描述
射击比赛成绩统计
给定一个射击比赛成绩单
包含多个选手若干次射击的成绩分数
请对每个选手按其最高三个分数之和进行降序排名
输出降序排名后的选手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 numpy
class 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]] = m
else:
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]) # 对最高的三个分数求和,并替换掉当前字段value
v = sums
s[k] = v
res = sorted(s.items(), key=lambda x: (-x[1], -x[0])) # 字典按照值降序+key降序的方式重拍
ret = []
for i in range(len(res)):
ret.append(res[i][0])
return ret
if __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))