Suppose we have two arrays called days and apples of same length n. There is a special kind of apple tree that grows apples every day for n consecutive days. On the ith day, it grows apples[i] number of apples and that will rot after days[i] days, so we can say it like that on day i + days[i] the apples will be rotten and cannot be eaten. On some days. If apples[i] = 0, and days[i] = 0, then it indicates on day i, the apple tree is not growing any apple. We can take at most one apple a day. (We can keep eating after the first n days). Here we have to find the maximum number of apples we can eat.
So, if the input is like apples = [1,2,3,5,2] days = [3,2,1,4,2], then the output will be 7 because −
On day 1, we eat an apple that grew on the first day.
On day 2, we eat an apple that grew on the second day.
On day 3, we eat an apple that grew on the second day. But after this day, the apples that grew on the third day will rot.
On days from 4 to 7, we eat apples that grew on the fourth day.
To solve this, we will follow these steps −
- minheap := a new empty heap
- day := 0, res := 0
- for i in range 0 to size of apples - 1, do
- day := i
- while minheap is not empty and rot value of top of minheap − day, do
- remove top element from minheap
- nbrApple := apples[i]
- expiration := i + days[i]-1
- if nbrApple > 0, then
- insert (expiration, nbrApple) pair into minheap
- if minheap is not empty, then
- (date, apple) := top element of minheap and remove it from heap
- res := res + 1
- if apple > 1, then
- insert (date, apple-1) pair into minheap
- while minheap is not empty, do
- day := day + 1
- while minheap is not empty and rot value of top of minheap < day, do
- remove top element from minheap
- if minheap is empty, then
- come out from loop
- (date, apple) := top of minheap and remove it from heap
- res := res + 1
- if apple > 1, then
- insert (date, apple-1) pair into minheap
- return res
Example
Let us see the following implementation to get better understanding −
import heapq def solve(apples, days): minheap = [] heapq.heapify(minheap) day = 0 res = 0 for i in range(len(apples)): day = i while minheap and minheap[0][0] < day: heapq.heappop(minheap) nbrApple = apples[i] expiration = i + days[i]-1 if nbrApple > 0: heapq.heappush(minheap, (expiration, nbrApple)) if minheap: date, apple = heapq.heappop(minheap) res += 1 if apple > 1: heapq.heappush(minheap, (date, apple-1)) while minheap: day += 1 while minheap and minheap[0][0] < day: heapq.heappop(minheap) if minheap == []: break date, apple = heapq.heappop(minheap) res += 1 if apple > 1: heapq.heappush(minheap, (date, apple-1)) return res apples = [1,2,3,5,2] days = [3,2,1,4,2] print(solve(apples, days))
Input
[1,2,3,5,2],[3,2,1,4,2]
Output
7