题目描述:
一个有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()