【华为机试】2023年真题B卷(python)-比赛

一、题目

题目描述:

一个有N个选手参加比赛,选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分。
打分规则为每个评委对选手打分,最高分10分,最低分1分。
请计算得分最多的3位选手的编号。
如果得分相同,则得分高分值最多的选手排名靠前(10分数量相同,则比较9分的数量,以此类推,用例中不会出现多个选手得分完全相同的情况)。

二、输入输出

输入描述:
第一行为半角逗号分割的两个正整数,第一个数字表示M(3<=M<=10)个评委,第二个数字表示N(3<=N<=100)个选手。
第2到M+1行是半角逗号分割的整数序列,表示评委为每个选手的打分,0号下标数字表示1号选手分数,1号下标数字表示2号选手分数,依次类推。
输出描述:

选手前3名的编号。
注:若输入为异常,输出-1,如M、N、打分不在范围内。

三、示例

示例1:

输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
4,5
10,6,9,7,6
9,10,6,7,5
8,10,6,5,10
9,10,8,4,9
输出:
2,1,5
说明:
第一行代表有4个评委,5个选手参加比赛
矩阵代表是4*5,每个数字是选手的编号,每一行代表一个评委对选手的打分排序,
2号选手得分36分排第1,1号选手36分排第2,5号选手30分(2号10分值有3个,1号10分值只有1个,所以2号排第一)

示例2   

输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
2,5
7,3,5,4,2
8,5,4,4,3
输出:
-1
说明:
只有2个评委,要求最少为3个评委
示例3   

输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
4,2
8,5
5,6
10,4
8,9
输出:
-1
说明:
只有2名选手参加,要求最少为3名
示例4   

输入输出示例仅供调试,后台判题数据一般不包含示例
输入:
4,5
11,6,9,7,8
9,10,6,7,8
8,10,6,9,7
9,10,8,6,7
输出:
-1
说明:
第一个评委给第一个选手打分11,无效分数

四、要求

时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K

五、参考代码 

# -*- coding: utf-8 -*-
'''
@File    :   2023-B-比赛.py
@Time    :   2023/12/24 13:38:56
@Author  :   mgc 
@Version :   1.0
@Desc    :   None
'''

import functools

def find_top_three_players():
    # 比较函数,用于排序
    def compare_scores(x, y):
        if x[2] != y[2]:  # 比较得分总和
            return y[2] - x[2]
        else:  # 得分总和相同,比较得分值
            return int(y[1]) - int(x[1])

    # 解析输入
    input_param = [int(x) for x in input().split(",")]
    m = input_param[0]
    n = input_param[1]

    nums = []
    flag = True

    # 获取评委的打分矩阵
    for i in range(m):
        num = [int(x) for x in input().split(",")]
        nums.append(num)
    for num in nums:
        if any(x < 1 or x > 10 for x in num):  # 检查打分是否在范围内
            print(-1)
            flag = False
            break
        
    if m < 3 or m > 10 or n < 3 or n > 100:
        print(-1)
        return

    if flag:
        scores = []

        # 计算每个选手的得分总和和得分值
        for i in range(n):
            score = [nums[j][i] for j in range(m)]
            
            score.sort()
            scores.append([i + 1, "".join(map(str, score)), sum(score)])

        # 对选手进行排序
        scores.sort(key=functools.cmp_to_key(compare_scores))
        result = [scores[i][0] for i in range(3)]
        print(",".join(map(str, result)))

# 调用函数
find_top_three_players()

你可能感兴趣的:(华为机试,华为,python,算法,华为机试,比赛)