原题链接
每一个pair(t,d)表示一个课程,t表示课程需要的时间,d表示该课程必须在时间d之前完成,要求返回最大可以完成的课程的数目。
题目的标签为贪心,然后这道题又类似刘汝佳的竞赛书《算法竞赛入门》贪心算法部分关于区间问题的讨论,想到了要先对数组courses根据每个小区间的最后一个元素从小到大进行排序,接着遍历每一门课程,统计当前已经选择的课程所需要的总天数,在选完当前的课程时,判断是否有足够的天数,如果有则继续遍历;否则需要将multiset res中课程天数最多的课程与当前课程交换。
class Solution {
public:
int scheduleCourse(vector<vector<int>>& courses) {
sort(courses.begin(),courses.end(),[](vector<int>& a,vector<int>& b){
return a[1]<b[1];
});
multiset<int> res;
int sum =0;
for(auto &item:courses){
sum+=item[0];
res.insert(item[0]);
if(sum>item[1]){
sum-=*res.rbegin();
res.erase(--res.end());
}
}
return res.size();
}
};