华为OD机试-射击比赛成绩

题目描述

射击比赛成绩统计
给定一个射击比赛成绩单
包含多个选手若干次射击的成绩分数
请对每个选手按其最高三个分数之和进行降序排名
输出降序排名后的选手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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值