9.23华为OD机试真题 新系统 – 世界杯徽章换购 (JavaPyCC++JsGo)
2026 华为OD机试真题9月23日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
球迷排成一队换购世界杯徽章。换购规则如下:
- 从队头开始,依次为每人换购 $1$ 枚徽章,每次换购耗时 $1$ 个单位时间;
- 若该球迷仍有未换完的徽章,则重新排到队尾继续等待;
- 若该球迷所有徽章已换完,则直接离队,不再参与后续排队。
给定每人需要换购的徽章数量数组 medals 和目标球迷下标 $k$,求当数组下标第 $k$ 号球迷换完所有徽章时,总耗时为多少?
2026 华为OD机试真题9月23日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
输入描述
第一行输入一个由英文逗号分隔的正整数数组 medals,medals[i] 表示数组下标第 $i$ 号球迷需要换购的徽章数。
第二行输入目标球迷下标 $k$,输入保证 $0 \le k < n$。
输出描述
输出一个整数,表示数组下标第 $k$ 号球迷换完所有徽章时的总耗时。
示例1
输入
2,3,2
2
输出
6
说明
初始队伍:
[0号(2), 1号(3), 2号(2)],其中 $2$ 号是目标球迷。
- 第 $1$ 轮遍历后,三名球迷各换购一枚,累计耗时为 $3$。
- 第 $2$ 轮中,三名球迷再次各换购一枚,$2$ 号球迷完成换购,累计耗时为 $6$。
示例2
输入
1, 5, 3
1
输出
9
说明
数组下标 $1$ 号球迷需要换购 $5$ 个徽章,第 $1$ 轮结束 $0$ 号离队(累计 $3$);第 $3$ 轮结束 $2$ 号离队(累计 $7$);第 $5$ 轮结束 $1$ 号全部换购(累计 $9$)。
解题思路
本题采用【数学统计】算法:目标球迷需要换购 medals[k] 枚徽章,因此他会参与这么多轮。只需统计在目标球迷完成之前,每名球迷一共会成功换购多少次,无需真的维护队列逐次模拟。
下标不大于 k 的球迷排在目标球迷前面或就是目标本人,在目标完成的最后一轮仍有机会换购,因此贡献为 min(medals[i], medals[k])。下标大于 k 的球迷位于目标后面,当目标在最后一轮完成后流程立即结束,他们无法参与这一轮,因此贡献为 min(medals[i], medals[k] - 1)。
遍历数组并累加所有贡献即可得到总耗时。使用 64 位整数保存结果,避免徽章数量较大时累