力扣1705——吃苹果的最大数目(贪心+优先队列)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

对于此类有deadline的问题,首先想到贪心,直到deadline之前再做,这样才能为其他尽可能留出时间,才能做得更多。
首先想到的是按deadline排序,然后依次倒序在deadline前吃,如果这天已经能吃了就往前推,但会WA,因为有的苹果虽然deadline晚,但开始时间早,过早的排完他们会影响其他deadline晚开始也晚的苹果。所以需要动态调整,不能因为deadlin晚就给全安排了,能自调整的首先就想到优先队列,每次队首的都是deadline最小的,也就是最快要腐烂的,如果吃完还有苹果,就入队继续,直到最后一天(未来不会有苹果产出且现存没有苹果)。

代码

class Solution {
public:
    struct food {
        int nums;
        int endtime;
        bool operator < (const food x) const {  //结束时间从小到大排
            return endtime > x.endtime;
        }
    };
    int eatenApples(vector<int>& apples, vector<int>& days) {
        int ans=0;
        int n = apples.size();
        priority_queue<food> foods;
        for(int i = 0; i < n || !foods.empty(); i++) {
            if(i < n && apples[i] != 0) {
                food f;
                f.endtime = i + days[i];
                f.nums = apples[i];
                foods.push(f);
            }
            while(!foods.empty() && foods.top().endtime <= i) 
            	foods.pop();
            if(!foods.empty()) {
                ans++;
                food tmp = foods.top();
                foods.pop();
                tmp.nums--;
                if(tmp.nums > 0) foods.push(tmp);
            }           
        }
        return ans;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值