思路是贪心的思想,维护一个优先队列,里面按照过期时间,从小到大排序,每次挑一个快要过期的苹果吃,这样的吃法总是最优先的。
注意在吃之前,需要跟新优先队列的信息,将过期苹果剔除优先队列。
注意:当没有新苹果加入后,还是可以把老苹果吃完。
using PII = pair<int,int>;
class Solution {
public:
int eatenApples(vector<int>& apples, vector<int>& days) {
int ans = 0;
priority_queue<PII, vector<PII>, greater<PII>> pq;
int n = apples.size();
int i = 0;
while (i < n) {
while(!pq.empty() && pq.top().first <= i) {
pq.pop();
}
int rottenDay = i + days[i];
int count = apples[i];
if (count) {
pq.emplace(rottenDay, count);
}
if (!pq.empty()) {
auto tmp = pq.top(); pq.pop();
tmp.second -= 1;
if (tmp.second) {
pq.emplace(tmp);
}
ans++;
}
i++;
}
while (!pq.empty()) {
while(!pq.empty() && pq.top().first <= i) {
pq.pop();
}
if (!pq.empty()) {
auto tmp = pq.top(); pq.pop();
tmp.second -= 1;
if (tmp.second) {
pq.emplace(tmp);
}
ans++;
}
i++;
}
return ans;
}
};