- 吃苹果的最大数目
有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 且 days[i] == 0 表示。
你打算每天 最多 吃一个苹果来保证营养均衡。注意,你可以在这 n 天之后继续吃苹果。
给你两个长度为 n 的整数数组 days 和 apples ,返回你可以吃掉的苹果的最大数目。
模拟
class Solution {
public:
int eatenApples(vector<int>& apples, vector<int>& days) {
vector<vector<int>> vec;
int size = apples.size();
for (int i = 0; i < size; i++) {
vector<int> temp;
temp.push_back(apples[i]);
temp.push_back(i + days[i] + 1);
vec.push_back(temp);
}
int cur = 1;
bool flag = true;
int res = 0;
while (flag) {
int mmin = INT_MAX, md = -1;
int i;
for (i = 0; i < size && i <= cur - 1; i++) {
if (vec[i][0] > 0 && vec[i][1] > cur) {
// cout << i << " " << vec[i][0] << " " << vec[i][1] << " " << cur << endl;
if (mmin > vec[i][1]) {
md = i;
mmin = vec[i][1];
}
}
}
if (md == -1 && i == size) {
break;
} else if (md == -1) {
cur++;
continue;
}
// cout << md << " " << mmin << endl;
vec[md][0]--;
res++;
cur++;
}
return res;
}
};
class Solution {
public:
#define PII pair<int, int>
int eatenApples(vector<int>& apples, vector<int>& days) {
int res = 0;
priority_queue<PII, vector<PII>, greater<PII> > save; //按过期日期升序
for (int i = 0; i < apples.size() || !save.empty(); i++) {
//到了过期那一天就删掉
while(!save.empty()
&& save.top().first == i){ //到了过期的日子
save.pop();
}
//加入今天产出的果子
if(i<apples.size()&&apples[i]!=0)
save.push(make_pair(i+days[i], apples[i]));
//如果有果子的话,吃果子
if(!save.empty()){
PII tmp = save.top();
save.pop();
res++;
tmp.second--;
if(tmp.second>0){ //果子没吃完,放回去
save.push(tmp);
}
}
}
return res;
}
};