題目描述
射擊比賽成績統計
給定一個射擊比賽成績單
包含多個選手若干次射擊的成績分數
請對每個選手按其最高三個分數之和進行降序排名
輸出降序排名后的選手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))