思路
对于此类有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;
}
};