LeetCode 5638. 吃蘋果的最大數目(優先佇列)
阿新 • • 發佈:2020-12-28
技術標籤:LeetCode
文章目錄
1. 題目
有一棵特殊的蘋果樹,一連 n 天,每天都可以長出若干個蘋果。
在第 i 天,樹上會長出 apples[i] 個蘋果,這些蘋果將會在 days[i] 天后(也就是說,第 i + days[i] 天時)腐爛,變得無法食用。
也可能有那麼幾天,樹上不會長出新的蘋果,此時用 apples[i] == 0 且 days[i] == 0
表示。
你打算每天 最多 吃一個蘋果來保證營養均衡。注意,你可以在這 n 天之後繼續吃蘋果。
給你兩個長度為 n 的整數陣列 days 和 apples ,返回你可以吃掉的蘋果的最大數目
示例 1:
輸入:apples = [1,2,3,5,2], days = [3,2,1,4,2]
輸出:7
解釋:你可以吃掉 7 個蘋果:
- 第一天,你吃掉第一天長出來的蘋果。
- 第二天,你吃掉一個第二天長出來的蘋果。
- 第三天,你吃掉一個第二天長出來的蘋果。過了這一天,第三天長出來的蘋果就已經腐爛了。
- 第四天到第七天,你吃的都是第四天長出來的蘋果。
示例 2:
輸入:apples = [3,0,0,0,0,2], days = [3,0,0,0,0,2]
輸出:5
解釋:你可以吃掉 5 個蘋果:
- 第一天到第三天,你吃的都是第一天長出來的蘋果。
- 第四天和第五天不吃蘋果。
- 第六天和第七天,你吃的都是第六天長出來的蘋果。
提示:
apples. length == n
days.length == n
1 <= n <= 2 * 10^4
0 <= apples[i], days[i] <= 2 * 10^4
只有在 apples[i] = 0 時,days[i] = 0 才成立
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/maximum-number-of-eaten-apples
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
2. 解題
- 優先佇列,貪心,先過期的先吃
typedef pair<int,int> pii;
struct cmp
{
bool operator()(pii& a, pii& b) const
{
return a.first > b.first;//小的,先過期的優先吃
}
};
class Solution {
public:
int eatenApples(vector<int>& apples, vector<int>& days) {
priority_queue<pii,vector<pii>, cmp> q;//pair 過期時間,剩餘的果子數量
int eat = 0, n = apples.size();
for(int i = 0; i < n || !q.empty(); i++)
{
while(!q.empty() && q.top().first==i)//蘋果過期了,刪除
q.pop();
if(i < n && apples[i] > 0)//當前的蘋果加入優先佇列
q.push({i+days[i], apples[i]});
if(!q.empty())
{
pii t = q.top();
q.pop();
eat++;//吃一個
if(--t.second > 0)//這一堆還沒吃完
q.push(t);
}
}
return eat;
}
};
892 ms 46.2 MB C++
我的CSDN部落格地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!