Description

给定一个数组a[1,n],每个元素ai具有2种属性{di,li},其中di表示消耗时长,li表示最后期限(含)。每单位时长只能同时消费1个元素。求最多能消耗的元素个数

Constraints

  • 1n104
  • 1di,li104

Solution

这道题适合作为反悔贪心的第二题。关联:第一题

数组按li排序,大根堆按di排序。这样保证了堆内操作时任意元素都是合法的

维护sum表示总时长,每次sum+di不超过则加入,否则淘汰sum内耗时最长的,等效替换为当前元素的di

Code

class Solution {
public:
    int scheduleCourse(vector<vector<int>>& courses) {
        ranges::sort(courses, [](auto &a, auto &b) {
            return a[1] < b[1];
        });
        priority_queue<int> pq;
        int sum = 0;
        for(auto &c : courses) {
            if(sum + c[0] <= c[1]) {
                pq.emplace(c[0]);
                sum += c[0];
            } else if(!pq.empty()) {
                auto d = pq.top();
                if(c[0] < d && sum - d + c[0] <= c[1]) {
                    pq.pop();
                    pq.emplace(c[0]);
                    sum -= d;
                    sum += c[0];
                }
            }
        }
        return pq.size();
    }
};

LeetCode-630 Course Schedule III