0
点赞
收藏
分享

微信扫一扫

【力扣·每日一题】630. 课程表 III (C++ 贪心 优先队列)


​​linkkk​​

题意

【力扣·每日一题】630. 课程表 III (C++ 贪心 优先队列)_c++

思路

经典贪心(不是
首先,结束时间晚的可以后选,因为他的可选性比较高。所以首先按照结束时间从小到大排序。
然后遍历一遍序列,记录当前的时间。对于当前遍历到的课程,分类讨论:

  • 如果当前的时间加上当前课程所需要的时间该课程的最晚结束时间,说明可以选该课程。
  • 如果此时无法选择该课程,可以将以前所选的需要时间最大的课程取消,用该课程替代。这样当前花费的时间会更少,而且课程数量还不变,更有利于最优解,这只是感性理解,具体证明见​​官方题解​​~

要动态的维护课程需要时间的最大值,用优先队列就可以了。

代码

class Solution {
public:
static bool cmp(vector<int> &a,vector<int> &b){
if(a[1]==b[1]){
return a[0]<b[0];
}
return a[1]<b[1];
}
int scheduleCourse(vector<vector<int>>& courses) {
sort(courses.begin(),courses.end(),cmp);
priority_queue<int>q;
int ans=0,now=0;
for(vector<int>t:courses){
if(now+t[0]<=t[1]){
now+=t[0];
q.push(t[0]);
}
else{
if(!q.empty()){
if(q.top()>t[0]){
now=now-q.top()+t[0];
q.pop();
q.push(t[0]);
}
}
}
}
return q.size();
}
};
/*
[[1,2],[2,3]]
*/


举报

相关推荐

0 条评论