题目:
有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 且 days[i] == 0 表示。
你打算每天 最多 吃一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。
给你两个长度为 n 的整数数组 days 和 apples ,返回你可以吃掉的苹果的最大数目。
思路:
优先级队列+贪心
解答:
class Solution:
def eatenApples(self, apples: List[int], days: List[int]) -> int:
ans = 0
pq = []
i = 0
#苹果树上会长苹果
while i < len(apples):
#当前队列不空,且队首苹果已经腐烂
while pq and pq[0][0]<=i:
heappop(pq)
#如果当天长出的苹果数量大于0,则入队
if apples[i]>0:
heappush(pq,[i+days[i],apples[i]])
#如果队列不空,则当天有苹果可吃(贪心:优先吃最快腐烂的苹果),将队首的苹果数量减1,并将能吃到的苹果数量+1
if pq:
pq[0][1]-=1
if pq[0][1]==0:
heappop(pq)
ans+=1
i+=1
#苹果树上不再长苹果
while pq:
#当前队列不空,且队首苹果已经腐烂
while pq and pq[0][0]<=i:
heappop(pq)
#取出当前队首元素,判断可以吃几天,需同时考虑 距离腐烂的天数和当前苹果数量,并取两者中较小的值
if not pq:
break
day,apple=heappop(pq)
num=min(day-i,apple)
ans+=num
i+=num
return ans