Problem
There is a special kind of apple tree that grows apples every day for n
days. On the ith
day, the tree grows apples[i]
apples that will rot after days[i]
days, that is on day i + days[i]
the apples will be rotten and cannot be eaten. On some days, the apple tree does not grow any apples, which are denoted by apples[i] == 0
and days[i] == 0
.
You decided to eat at most one apple a day (to keep the doctors away). Note that you can keep eating after the first n
days.
Given two integer arrays days
and apples
of length n
, return the maximum number of apples you can eat.
Example 1:
1 | Input: apples = [1,2,3,5,2], days = [3,2,1,4,2] |
Example 2:
1 | Input: apples = [3,0,0,0,0,2], days = [3,0,0,0,0,2] |
Constraints:
n == apples.length == days.length
1 <= n <= 2 * 104
0 <= apples[i], days[i] <= 2 * 104
days[i] = 0
if and only ifapples[i] = 0
.
Analysis
题目给出两个数组apples
和days
,apples[i]
代表第i
天生产了多少个苹果,days[i]
代表第i
天生产的苹果几天后腐烂,所以能够使用的天数就是i + days[i] - 1
。这道题目其实很贴近实际,食品都有一个保质期,那为了能吃到最多的苹果,很直接的做法就是每次都吃快要过期的,这种吃法肯定是能吃最多的。
所以这就是一个贪心算法,而贪心算法一般结合priority queue做,这里就是按照过期时间来排序。遍历数组,先把当前的苹果加进去,然后把已经过期的pop掉,如果还有剩,就吃一个,数量减1。
Solution
需要注意外层大循环的条件,不只是i < n
,还有!pq.empty()
,因为题目说了不生产之后,还是可以继续吃的,知道没得吃或者都烂掉了。
Code
1 | struct cmp { |
Summary
这道题目是非常经典的使用priority queue解决贪心问题,难度不大。这道题目的分享到这里,感谢你的支持!