1:课程选择问题
630. 课程表 III - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/course-schedule-iii/
class Solution {
public:
bool compare(int a,int b){
return a<b;
}
int scheduleCourse(vector<vector<int>>& courses) {
sort(courses.begin(), courses.end(), [](const auto &x, const auto &y){return x[1] < y[1];});//将数组按照结束时间的升序结果排列
priority_queue<int>p;//建立大根堆存储持续时间
int now=0;//表示当前方案的结课时间
for(int i=0;i<courses.size();i++){
int t=courses[i][0];
int d=courses[i][1];
if(now+t<=d){
now=now+t;
p.push(t);
}
else if(!p.empty()){
int tmax=p.top();
if(tmax>t){
p.pop();
p.push(t);
now=now-tmax+t;
}
}
}
return p.size();
}
};
首先对于两个课程结束时间有早有晚的情况。
首先证明选择要先选择结束时间早的学习后学结束时间晚的是最佳方案。
(因为经过证明先学结束时间晚的成立的话,那么先学结束时间早的方案也一定成立;但是先学结束时间早的方案成立的情况下,先学结束时间晚的方案不一定成立)
所以首先要对原数组按照结束时间从小到大排列
后续算法如下:(关于方案的具体证明过程见题解)