目录

3506:查找消除细菌菌株所需时间(★★)

力扣第 3506 题

题目

给定一个整数数组 timeReq 和一个整数 splitTime

在人体微观世界中,免疫系统面临着一项非凡的挑战:对抗快速繁殖的细菌群落,这对身体的生存构成威胁。

最初,只部署一个 白细胞WBC)来消除细菌。然而,单独的白细胞很快意识到它无法跟上细菌的生长速度。

WBC制定了一种巧妙的策略来对抗细菌:

  • i 个细菌菌株需要 timeReq[i] 个时间单位来被消除。
  • 单个白细胞只能消除 一个 细菌菌株。之后,白细胞耗尽,无法执行任何其他任务。
  • 一个白细胞可以将自身分裂为两个白细胞,但这需要 splitTime 单位时间。一旦分裂,两个白细胞就可以 并行 消灭细菌。
  • 一个白细胞仅可以攻击一个细菌菌株。多个白细胞不能同时攻击一个菌株。

您必须确定消除所有细菌菌株所需的 最短 时间。

注意,细菌菌株可以按任何顺序消除。

示例 1:

输入:timeReq = [10,4,5], splitTime = 2

输出:12

解释:

消除过程如下:

  • 最初,有一个白细胞。经过 2 个时间单位后,白细胞分裂成 2 个白细胞。
  • 其中一个白细胞在 t = 2 + 10 = 12 时间内消除菌株 0。另一个白细胞使用 2 个单位时间再次分裂。
  • 2 个新的白细胞消灭细菌的时间是 t = 2 + 2 + 4t = 2 + 2 + 5

示例 2:

输入:timeReq = [10,4], splitTime = 5

输出:15

解释:

消除过程如下:

  • 最初,有一个白细胞。经过 5 个时间单位后,白细胞分裂成 2 个白细胞。
  • 2 个新的白细胞消灭细菌的时间是 t = 5 + 10t = 5 + 4

提示:

  • 2 <= timeReq.length <= 105
  • 1 <= timeReq[i] <= 109
  • 1 <= splitTime <= 109

相似问题:

分析

  • 1199 完全相同

解答

1
2
3
4
5
6
7
class Solution:
    def minEliminationTime(self, timeReq: List[int], splitTime: int) -> int:
        pq = sorted(timeReq)
        while len(pq)>1:
            a,b = heappop(pq),heappop(pq)
            heappush(pq,b+splitTime)
        return pq[0]

111 ms