通过率 49% · 提交 683 · 通过 334
小慕正在组织一场编程马拉松比赛,共有N位选手参赛,选手编号为1到N(3≤N≤100)。比赛邀请了M位进行(3≤M≤10)。每位评委对每位选手的打分范围为1到10分。现在小慕需要找出得分最高的3位选手的编号。如果选手的总分相同,则比较他们获得10分的次数,次数多的排名靠前;如果10分次数也相同,则比较9分的次数,以此类推。题目保证不会出现多个选手得分完全相同的情况。
这类题属于华为 OD 机考真题方向中「100分 / 排序」方向的高频题型,通常考察对「100分 / 排序」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行为半角逗号分割的两个正整数,第一个数字表示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
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
比较典型的排序题,先按照分数总和进行逆序排序,但由于在分数相同的时候要依次比较分数 10 到 1 的分数的个数,如果直接用 lambda 表达式 来完成会写得比较长,所以可以换成 自定义函数 的方式来得到函数返回值。
剩下的主要问题就是处理异常了。
1. 第一种:类似示例二、三、四所示,给出的数据不位于指定范围内。 2. 第二种:输入的格式有问题,譬如行数列数不够、分割符并非逗号、输入包含字母等无关字符等等。
第一种错误是可以通过 条件语句 来排除掉的,但第二种错误因为错误种类繁杂,我们也无法提前知道考试时候的具体测试用例中包含哪些错误,因此需要使用 try-except 异常处理语句 来进行处理。
由于可能存在多种异常,我们不妨把整个解决问题的代码放在函数 solve() 中,一旦出现异常情况就可以立刻通过 return 来终止函数的运行。
那么整体的框架为:
剩下的问题就是在 try 的分支下面填充细节了,都是比较基础的语法内容。
复杂度分析 设 N 为选手人数,M 为评委人数(题面给定 3 ≤ N ≤ 100、3 ≤ M ≤ 10)。
总时间复杂度为 O(N·M + N log N),在 N ≤ 100、M ≤ 10 的规模下开销很小;空间上哈希表存 N 个选手各 M 个分数,为 O(N·M)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
输出示例
-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,无效分数
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有