题意
思路
经典贪心(不是
首先,结束时间晚的可以后选,因为他的可选性比较高。所以首先按照结束时间从小到大排序。
然后遍历一遍序列,记录当前的时间。对于当前遍历到的课程,分类讨论:
如果当前的时间加上当前课程所需要的时间< =该课程的最晚结束时间,说明可以选该课程。
如果此时无法选择该课程,可以将以前所选的需要时间最大的课程取消,用该课程替代。这样当前花费的时间会更少,而且课程数量还不变,更有利于最优解,这只是感性理解,具体证明见官方题解~
要动态的维护课程需要时间的最大值,用优先队列就可以了。
代码
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]] */