leetcode 630. 课程表 III
630. 课程表 III
这题的思路是贪心;
首先对于一个课程,[d1,ed1],[d2,ed2];如果都能满足要求,我们优先选择ed小的;这里假设ed1<ed2;
证明:如果ed2选上能获得最优解,那么ed2的课程换成ed1一定不比最优解差,所以按照结束时间ed排序;
问题在于当dx+time>edx时,这时候遇到不满足的条件,此时我们如果直接舍去这个课程可能会丢掉最优解
因为我们按课程结束时间添加,如果此时 dx+time>edx而且d1<我们之前添加课程的最大值maxd,这时候
我们可以进行替换,把学那门课的时间用来学dx,此时edx也是能满足要求的,因为ed是按时间排序的
1 class Solution { 2 public: 3 int scheduleCourse(vector<vector<int>>& courses) { 4 sort(courses.begin(),courses.end(),[](vector<int>&a,vector<int>&b){return( a[1]==b[1])?a[0]<b[0]:a[1]<b[1];}); 5 priority_queue<int,vector<int>,less<>>q; 6 int time=0; 7 for(auto &p:courses) 8 { 9 if(p[0]+time<=p[1]) 10 { 11 q.push(p[0]); 12 time+=p[0]; 13 } 14 else 15 { 16 if(q.size()&&q.top()>p[0]) 17 { 18 time=time-q.top()+p[0]; 19 q.pop(); 20 q.push(p[0]); 21 } 22 } 23 } 24 return q.size(); 25 } 26 };

浙公网安备 33010602011771号