华为OD机试 - 比赛的冠亚季军(Java & JS & Python)

本博客介绍了一种解决竞技比赛决出冠亚季军的算法,通过逻辑分析和模拟比赛过程,逐步淘汰实力较弱的运动员。文章以Java、JS和Python为例,展示了如何实现该算法,包括如何处理实力值相等和轮空的情况,并最终确定冠军、亚军和季军的ID。

题目描述

有N(3 ≤ N < 10000)个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛,获胜的进入下一轮;实力值大的获胜,实力值相等的情况,id小的情况下获胜;轮空的直接进入下一轮。

输入描述

输入一行N个数字代表N的运动员的实力值(0<=实力值<=10000000000)。

输出描述

输出冠亚季军的id,用空格隔开。

用例

输入 2 3 4 5
输出 3 1 2 
说明

第一轮比赛,

id为0实力值为2的运动员和id为1实力值为3的运动员比赛,1号胜出进入下一轮争夺冠亚军,

id为2的运动员和id为3的运动员比赛,3号胜出进入下一轮争夺冠亚军,

冠亚军比赛,

### 华为OD比赛冠亚季军详情 在华为OD比赛中,冠亚季军的产生遵循特定规则。参赛运动员ID0到N-1,其实力一组整数表示[^2]。比赛过程中,相邻的运动员两两对决,每一轮中实力值较大的选手晋级下一轮;若实力值相等,则ID较小的选手胜出。当选手数量为奇数时,最后一位选手直接轮空进入下一轮。 根据题目描述,最终的比赛结果可以通过模拟实现。例如,在一个具体案例中,冠军被确定为3号选手,亚军为1号选手,而季军则通过2号与0号选手的实力对比得出,由于2号选手的实力值为4大于0号选手的实力值2,因此2号选手获得季军[^1]。 以下是基于上述规则的一个代码示例,用于模拟比赛过程并输出冠亚季军名单: ```python def find_champions(strengths): players = list(range(len(strengths))) # 初始化选手列表 while len(players) &gt; 1: winners = [] n = len(players) for i in range(0, n - 1, 2): # 每两个选手进行比赛 if strengths[players[i]] &gt; strengths[players[i + 1]]: winners.append(players[i]) elif strengths[players[i]] &lt; strengths[players[i + 1]]: winners.append(players[i + 1]) else: # 实力值相等时,ID小的胜出 winners.append(min(players[i], players[i + 1])) if n % 2 == 1: # 如果选手数量为奇数,最后一个选手直接晋级 winners.append(players[-1]) players = winners # 更新选手列表 champion = players[0] # 决定亚军和季军 second_round = [i for i in range(len(strengths)) if i != champion] second_winners = [] n = len(second_round) for i in range(0, n - 1, 2): if strengths[second_round[i]] &gt; strengths[second_round[i + 1]]: second_winners.append(second_round[i]) elif strengths[second_round[i]] &lt; strengths[second_round[i + 1]]: second_winners.append(second_round[i + 1]) else: second_winners.append(min(second_round[i], second_round[i + 1])) if n % 2 == 1: second_winners.append(second_round[-1]) runner_up = second_winners[0] third_place_candidates = [i for i in second_winners if i != runner_up] third_place = third_place_candidates[0] if third_place_candidates else None return champion, runner_up, third_place # 示例输入 strengths = [2, 1, 4, 5] # 各选手的实力值 champion, runner_up, third_place = find_champions(strengths) print(f&quot;冠亚季军分别为:{champion} {runner_up} {third_place}&quot;) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水乐园

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值