1. 程式人生 > 其它 >leetcode 630. 課程表 III

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