小红正在术式终端上维护一套由 n 个魔导模块构成的核心系统。每个模块 i 在运行时的执行耗时为 a_i 。根据术士协会的规程,每个模块都有一个性能下限 b_i ,即该模块的执行耗时无论如何优化都不能低于 b_i 。 小红计划在接下来的 m 天内,每天对其中一个模块进行一次效能迭代。如果选中的模块当前耗时为 t ,经过一次迭代后,其新耗时将变为 max(⌈ t / 2 ⌉, b_i) 。其中 ⌈ x ⌉ 表示对 x 向上取整。 请问在 m 天的优化结束后,所有模块的执行耗时之和最小是多少?
第一行包含两个整数 n 和 m ( 1 ≤ n ≤ 1000, 0 ≤ m ≤ 1000 ),分别表示模块的数量和优化的总天数。 第二行包含 n 个整数 a_1, a_2, ..., a_n ( 1 ≤ a_i ≤ 10^5 ),表示各模块的初始执行耗时。 第三行包含 n 个整数 b_1, b_2, ..., b_n ( 1 ≤ b_i ≤ a_i ≤ 10^5 ),表示各模块允许的执行耗时下限。
输出一个整数,表示 m 天后所有模块执行耗时之和的最小值。
2 3 100 80 40 10
70
考点:堆
数据规模 n ≤ 1e3 | 限制 1 秒 / 256MB | 标准输入输出
推荐方向:堆
本题切入点
每次迭代的最优选择是「当前能减少最多的模块」:用最大堆按 (t − max(⌈t/2⌉, b)) 的收益维护,逐天弹出更新后压回,m 天后求总和。
用堆在 O(log n) 内取极值,求 TopK 与动态中位数。
思路框架(堆 通法 · 非本题专属)
实现要点:Python 的 heapq 是小根堆,要大根堆就存负数。
复杂度:时间 O(n log k) / O(n log n) | 空间 O(k)
该范式的通法易错点
对照本题
样例 1:输入 2 3 / 100 80 / 40 10 → 输出 70
在样例中, n=2, m=3 :
最终各模块的耗时分别为 50 和 20 ,总和为 50 + 20 = 70 。此时总和达到最小。
解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:2026年-华为-04月08号研发岗。