1. 程式人生 > 其它 >LeetCode 5638. 吃蘋果的最大數目(優先佇列)

LeetCode 5638. 吃蘋果的最大數目(優先佇列)

技術標籤: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. 解題

參考大佬:https://leetcode-cn.com/problems/maximum-number-of-eaten-apples/solution/c-you-xian-dui-lie-mo-ni-by-fdl-kdvx/

  • 優先佇列,貪心,先過期的先吃
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阿明),一起加油、一起學習進步!
Michael阿明