630. Course Schedule III 【Hard】 贪心

来源:互联网 发布:男士皮肤保养 知乎 编辑:程序博客网 时间:2024/06/11 00:53

题目:给出若干课程,课程有2个信息,第一个是课程的持续天数,第二个是课程的截止日期。同一个课程必须是连续修的,在截止日期前上完课程算修完这门课程。求最多可以修的课程数。


思路:贪心的思路

先把课程按截止日期排序,然后从前到后遍历课程:

若该课程可以修(即已修的课程的天数总和,加上这门课的天数不超过此门课程的截止日期),则选择这门课

否则,把已修的课程里天数最多的与此门课比较,若前者更大则把前者的课程drop掉,take这门课程


难度一般,被排序时间卡了一会


void ch(int& a, int& b) {int temp;temp = a;a = b;b = temp;}void sort(vector<vector<int>>& courses, int s, int e) {    if (e - s <= 0) return;int i = s, j = e;while (i < j) {while (courses[j][1] >= courses[i][1] && i < j) --j;if (i < j) {ch(courses[i][0], courses[j][0]);ch(courses[i][1], courses[j][1]);++i;}while (courses[j][1] >= courses[i][1] && i < j) ++i;if (i < j) {ch(courses[i][0], courses[j][0]);ch(courses[i][1], courses[j][1]);--j;}}sort(courses, s, i - 1);sort(courses, i + 1, e);}struct cmp {bool operator() (int& a, int& b) {return a < b;}};class Solution {public:    int scheduleCourse(vector<vector<int>>& courses) {        sort(courses, 0, courses.size() - 1);        int total_days = 0, count = 0;        priority_queue<int, std::vector<int>, cmp> days_taken;        for (int cur = 0; cur < courses.size(); ++cur) {        if (total_days <= courses[cur][1] - courses[cur][0]) {        days_taken.push(courses[cur][0]);        total_days += courses[cur][0];        //take_course(days_taken, courses[cur][0], total_days);        count++;        } else {        if (!days_taken.empty() && days_taken.top() > courses[cur][0]) {        total_days -= days_taken.top() - courses[cur][0];        days_taken.pop();        days_taken.push(courses[cur][0]);        }        //replace_max(days_taken, courses[cur][0], total_days);        }        }        return count;    }};


原创粉丝点击