通过率 25% · 提交 704 · 通过 177
小慕正在组织一场有N名选手参加的比赛,选手的编号为0到N-1,每位选手的实力用一个整数表示。现在需要决出最终的冠军和亚军。比赛规则是:第一轮中,编号0和1对战,2和3对战,以此类推,相邻编号的选手进行比赛;每轮比赛中,实力值较大的选手获胜,若实力值相等,则编号较小的选手获胜;获胜者进入下一轮,的选手自动晋级。
这类题属于华为 OD 机考真题方向中「2024E / 模拟」方向的高频题型,通常考察对「2024E / 模拟」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入一行N个数字代表N个运动员的实力值(0 <= 实力值 <= 10000000000).
输出冠亚季军的id,用空格隔开
示例 1
输入示例
2 3 4 5
输出示例
3 1 2
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
数据量只有 10000,并不是一个很大的数据量,可以直接根据题意对比赛进行模拟。由于每一轮比赛都会使得总人数减半,大概需要 logN 轮比赛,每轮比赛考虑的人数和 N 相关,所以总的时间复杂度为 O(NlogN)。
在剩余人数大于等于 5 的时候,比赛的逻辑是类似的。当:
len(nums) 为偶数,则编号相邻的人进行比拼,实力更高的人进入下一轮len(nums) 为奇数,除了相邻的人需要进行比拼之外,编号最末尾的人轮空进入下一轮故可以用以下代码来表示这个比赛过程:
在每一次 while 循环中,使用了一个新的数组 nums_new 来储存当前数组 nums 中进入下一轮的选手情况。并且在本次 while 循环结束后,我们将 nums_new 拷贝给了 nums,用作下一次 while 循环操作。
比赛进行到最后的决胜轮次只会有两种情况:剩下 3 个人或者 4 个人。
假设这三个人按照 id 大小排序分别为 A B C:
对应代码如下:
假设这三个人按照 id 大小排序分别为 A B C D。这就是示例所给出的情况:
对应代码如下:
PS:本题的题目描述非常模糊,有不少同学提出异议。对于最后决胜轮次的比拼规则,只能按照唯一的示例进行猜测。
如果关于最后剩余人数为 3 的情况的冠亚季军角逐的比赛顺序为:先进行 A 跟 B 的比拼,败者为季军,其中胜者再跟轮空的 C 进行比拼决出冠亚军。那么对应的代码则修改为:
要学会能够自己根据不同的模糊题意描述进行代码的修改和测试。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有