You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

竞赛题优化:解决堆方法超时的考试时间处理问题

求优化考试时间递减操作的算法(O(nlogn)复杂度)

我有一个列表 examTime = [3, 3, 6, 3, 9],给定参数 a = 3,b = 2。

约束条件

  • 数组长度:1 ≤ len(examTime) ≤ 10^5
  • 元素范围:1 ≤ examTime[i] ≤ 10^9
  • 参数范围:1 ≤ b < a ≤ 10^9

任务要求

需要重复执行以下操作,直到数组中所有元素都≤0:每次找到数组中的最大值,将其减去a,同时将数组中其他所有元素减去b。

操作示例

步骤1:最大值9减3,其余元素减2,得到新数组:[1, 1, 4, 1, 6]
步骤2:最大值6减3,其余元素减2,得到新数组:[-1, -1, 2, -1, 3]
步骤3:最大值3减3,其余元素减2,得到新数组:[-3, -3, 0, -3, 0]
完成所有操作共需要3次。

当前问题

要求算法时间复杂度为O(nlogn),我原本用堆来实现:每次弹出最大值处理,再给堆中所有元素减b,但面对大数据量(比如下面的测试用例)时程序超时,有没有更高效的解决方法?

补充信息

原堆实现算法

func minOps(examTime, x, y) {
    // 转负数用最小堆模拟最大堆
    1. 将 examTime 中所有元素转为负数
    2. 执行堆化操作
    3. 循环直到堆为空:
          popped = -从堆中弹出元素 - x
          遍历堆中所有元素,每个元素减去y,若结果≤0则弹出堆
          如果 popped 大于0,将其压入堆中
    4. 每次循环后操作计数加1
}

超时测试用例

examTime = [1000000000] * 100000, a = 10000, b = 100

内容的提问来源于stack exchange,提问作者AS Scorpio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 11:43:11