题意理解
给出一组课程的时长和结束时间,问如何排课,让课程最多。
问题分析
贪心
结束时间越早的课程先排,每次排都紧前排,空闲时间都让给后面。如果排完一个课程后发现课程总时长超过了最晚的结束时间,说明课程有重叠,删除掉时长最长的课程再继续排。注意这个最长时长课程可能是当前课程。
其他
第二个贪心处理不好理解。
0716:删除掉时长最长的课程可能是当前课程;排序只按照结束时间排序,不能对时长二次排序。
0801:priority_queue默认是大顶堆,如果希望是小顶堆,初始化参数增加vector<int>,greater<int>。C++的头文件选<bits/stdc++.h>。
链接
int scheduleCourse(vector<vector<int>>& courses) {
sort (courses.begin(), courses.end(), [](const vector<int>& a1, const vector<int>& a2) {
return a1[1] < a2[1];
}); //按照结束时间排序,注意,lambda中参数用的是& const,时间降低了非常多
int n = 0; //总课程数
priority_queue<int> durations; //大顶堆,保存已选课程,方便选取最大值
int now = 0; //当前时间
for (int i = 0; i != courses.size(); i ++) { //遍历排序的课程表
durations.push (courses[i][0]); //课程时长入堆
now += courses[i][0]; //当前时间推移一个课程
n++; //课程数+1
if (now > courses[i][1]) { //如果当前时间超过了课程结束时间
int del_duration = durations.top(); //找已入课程的最大时长(包括当前时长)
now -= del_duration; //删除最大时长课程,当前时间后退
n --; //减少一个课程
durations.pop(); //弹出堆中最大值
}
}
return n; //返回数量
}