【Leetcode】1705. 吃苹果的最大数目——1930

题目

1705. 吃苹果的最大数目

有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0days[i] == 0 表示。

你打算每天 最多吃一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。

给你两个长度为 n 的整数数组 daysapples ,返回你可以吃掉的苹果的最大数目。

  • \(apples.length==n\)
  • \(days.length==n\)
  • \(1\leq n\leq 2*10^4\)
  • \(0\leq apples[i],days[i]\leq 2*10^4\)
  • 只有在apples[i]=0时,days[i]=0才成立

思路

首先要吃到更多的苹果,对于已有的一些苹果,我们优先选择马上坏掉的总是不差于比这些苹果晚一些坏掉的。

因为随着时间的推移,优先坏掉的总是比其余的更早不能使用,而其余的苹果也总是可以在最优先坏掉的苹果之后的一段时间内仍然可以使用。

因此我们使用堆存储若干个苹果和其坏掉的时间。

在前n天,由于每天都可能有新的苹果成熟,因此需要每次推进一天进行判断。

在所有苹果都成熟之后,每次可以根据当前最先坏的天数和时间实际上一次可以推进若干天,而无需每天进行单独遍历。

class Solution:
    def eatenApples(self, apples: List[int], days: List[int]) -> int:
        q = []
        ans = 0
        # 初始可能长苹果的时间
        for i,x in enumerate(apples):
            if x:
                heappush(q, [i+days[i], x])
            while q and q[0][0]<=i:
                heappop(q)
            if q:
                q[0][1]-=1
                ans+=1
                if q[0][1]<=0:
                    heappop(q)
        curday = len(apples)
        while q:
            cur = heappop(q)
            can = min(cur[0]-curday, cur[1]) # 可以吃的苹果数
            ans+= can
            curday+=can
        return ans
posted @ 2024-10-22 13:54  TICSMC  阅读(9)  评论(0)    收藏  举报