反悔贪心
课程表
这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。返回你最多可以修读的课程数目。
class Solution {
public:
int scheduleCourse(vector<vector<int>>& courses) {
sort(courses.begin(), courses.end(), [](const vector<int>&v1, const vector<int>&v2){
return v1[1] < v2[1]; //按照结束时间排序
});
priority_queue<int> pq;
int day = 0;
for(int i=0;i<courses.size();i++){
int duration = courses[i][0], last_day = courses[i][1];
if(duration + day <= last_day){ //满足条件
pq.push(duration);
day += duration;
}else if(!pq.empty() && pq.top() > duration){ //选出持续时间最长的剔除
day += duration - pq.top();
pq.pop();
pq.push(duration);
}
}
return pq.size();
}
};
class Solution {
public:
int minRefuelStops(int target, int startFuel, vector<vector<int>>& stations) {
priority_queue<int> pq;
sort(stations.begin(), stations.end(), [](const vector<int>&v1, const vector<int>&v2){
return v1[0] <v2[0];//对加油站位置进行排序
});
int now = startFuel;
int idx = 0;
int n = stations.size();
int cnt = 0;
while(now < target){
while(idx < n && stations[idx][0] <= now){
pq.push(stations[idx++][1]);
}
if(pq.empty())return -1;
now += pq.top();//选取最大油量进行加油
cnt ++;
pq.pop();
}
return cnt;
}
};
class Solution {
public:
int magicTower(vector<int>& nums) {
priority_queue<int, vector<int>, greater<>>pq;
int cnt=0;
long long sum=0;
for(int i:nums)sum+=i;
if(sum<0)return -1;
long long now = 1;
for(int i:nums){
now+=i;
if(i<0){
pq.push(i);
}
if(now<=0){
while(!pq.empty() && now<=0){
cnt++;
now-=pq.top();
pq.pop();
}
}
}
return cnt;
}
};