LeetCode 3296.移山所需的最少秒数

发布时间:2026/6/30 2:02:19
LeetCode 3296.移山所需的最少秒数 给你一个整数 mountainHeight 表示山的高度。同时给你一个整数数组 workerTimes表示工人们的工作时间单位秒。工人们需要 同时 进行工作以 降低 山的高度。对于工人 i :山的高度降低 1需要 workerTimes[i] 秒。山的高度降低 2需要 workerTimes[i] * 2 秒。…山的高度降低 x需要 workerTimes[i] * x 秒。工人 i 所花费的总时间是所有 x 单位所需时间的总和。由于所有工人同时操作所需的总时间是任何工人花费的 最大 时间。返回一个整数表示工人们使山的高度降低到 0 所需的 最少 秒数。示例 1输入 mountainHeight 4, workerTimes [2,1,1]输出 3解释将山的高度降低到 0 的一种方式是工人 0 将高度降低 1花费 workerTimes[0] 2 秒。工人 1 将高度降低 2花费 workerTimes[1] workerTimes[1] * 2 3 秒。工人 2 将高度降低 1花费 workerTimes[2] 1 秒。因为工人同时工作所需的最少时间为 max(2, 3, 1) 3 秒。示例 2输入 mountainHeight 10, workerTimes [3,2,2,4]输出 12解释工人 0 将高度降低 2花费 workerTimes[0] workerTimes[0] * 2 9 秒。工人 1 将高度降低 3花费 workerTimes[1] workerTimes[1] * 2 workerTimes[1] * 3 12 秒。工人 2 将高度降低 3花费 workerTimes[2] workerTimes[2] * 2 workerTimes[2] * 3 12 秒。工人 3 将高度降低 2花费 workerTimes[3] workerTimes[3] * 2 12 秒。所需的最少时间为 max(9, 12, 12, 12) 12 秒。示例 3输入 mountainHeight 5, workerTimes [1]输出 15解释这个示例中只有一个工人所以答案是 workerTimes[0] workerTimes[0] * 2 workerTimes[0] * 3 workerTimes[0] * 4 workerTimes[0] * 5 15 秒。提示1 mountainHeight 105^551 workerTimes.length 104^441 workerTimes[i] 106^66直接模拟循环mountainHeight次每次循环中一个工人降低1的高度取工作总时间最短的那个工人这可以用小顶堆来实现classSolution{public:longlongminNumberOfSeconds(intmountainHeight,vectorintworkerTimes){vectortuplelonglong,longlong,inth(workerTimes.size());for(inti0;iworkerTimes.size();i){h[i]{workerTimes[i],workerTimes[i],workerTimes[i]};}make_heap(h.begin(),h.end(),greater());longlongans0;while(mountainHeight0){// 已工作的总时间当前使高度降低1所需时间初始使高度降低1所需时间auto[total,need,base]h[0];// 每次更新答案为已工作的总时间anstotal;pop_heap(h.begin(),h.end(),greater());h.back(){totalneedbase,needbase,base};push_heap(h.begin(),h.end(),greater());--mountainHeight;}returnans;}};如果山的高度为m工人数量为n则此算法时间复杂度为O(nmlogn)空间复杂度为O(n)。