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 };

 

posted @ 2021-12-14 16:56  matt-11  阅读(50)  评论(0)    收藏  举报