华为 · 堆 · 算法编程题
华为 N ≤ 1e4 时限 3 秒 / 256 MB

题目描述

在一个繁忙的外卖配送站中,有 M 个充电宝(编号从 1 到 M )可供骑手更换。现在有 N 位骑手(按输入顺序编号从 1 到 N )陆续到达充电站,需要更换电量耗尽的电池。
换电规则如下:
- 当一位骑手到达时,他会立即归还正在使用的电池(此时该电池对应的充电宝可供下一位骑手使用)。
- 然后,他会从当前所有可用的充电宝中,选择编号最小的一个来使用。
- 充电宝一旦被占用,会持续充电一段时间,直到被下一位归还此充电宝的骑手释放。
所有骑手的到达时间都是唯一的。您的任务是,找出按输入顺序编号为 K 的那位骑手,最终使用了哪个编号的充电宝。

输入输出

输入描述
第一行包含三个用空格分隔的整数: M , N , K 。
- M :充电宝的总数。
- N :需要更换电池的骑手总数。
- K :需要查询其使用充电宝编号的骑手编号。
- 约束条件: 1 ≤ K ≤ N ≤ M ≤ 10^4 。
接下来的 N 行,每行代表一位骑手的信息(按编号 1 到 N 的顺序给出)。每行包含两个整数:
- s_i :第 i 位骑手的到达时间。
- t_i :第 i 位骑手归还的电池所需的充电时间。
- 约束条件: 1 ≤ s_i, t_i ≤ 10^5 。
输出描述
输出一个整数,代表编号为 K 的骑手所使用的充电宝的编号。

样例共 1 组

样例 1
输入
12 8 4
50 1
14 32
15 2
22 88
42 14
25 14
9 40
35 50
输出
3

算法解析依据充分

考点:堆

数据规模 N ≤ 1e4 | 限制 3 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:K ≤ 1e4,N ≤ 1e4,M ≤ 1e4
  • 元素值域:s_i ≤ 1e5,t_i ≤ 1e5(注意整数类型选择,避免溢出)
  • 复杂度门槛:只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 源站时限:3 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:堆

本题切入点

用最小堆维护「当前可用充电宝编号」,同时按归还时间弹出释放;骑手按到达时间排序后依次取堆顶编号,O(N log M)。

用堆在 O(log n) 内取极值,求 TopK 与动态中位数。

思路框架(堆 通法 · 非本题专属)

  1. 求最大 K 个:维护大小 K 的小根堆,超了就把堆顶弹出。
  2. 动态中位数:用「对顶堆」——小的一半放在大根堆,大的一半放在小根堆,两个堆顶就是中位数。
  3. 移动窗口中的中位数需要配合「延迟删除」处理过期元素。

实现要点:Python 的 heapq 是小根堆,要大根堆就存负数。

复杂度:时间 O(n log k) / O(n log n) | 空间 O(k)

该范式的通法易错点

  • 求第 K 大时堆类型选反(小根堆还是大根堆)。
  • 窗口滑出元素时忘记从堆里清理或标记过期。

对照本题

  • 数据规模 N ≤ 1e4,只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 元素值域最大到 1e5 —— 求和 / 相乘时记得开 64 位整数。

样例

样例 1

  • 输入:12 8 4 / 50 1 / 14 32 / 15 2 / 22 88 / 42 14 / 25 14 / 9 40 / 35 50
  • 输出:3

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-10月10号留学生开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解