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.length1 <= n <= 2 * 1040 <= apples[i], days[i] <= 2 * 104days[i] = 0if 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解决贪心问题,难度不大。这道题目的分享到这里,感谢你的支持!