作业调度

进阶

作业调度利用截止时间和利润做贪心,优先保住高利润任务。

作业调度

输入偶数个整数:截止时间、利润交替。

AlgoAnim · 作业调度

待机

速度
待机
// 源代码
1int jobSchedule(vector<tuple<int,int,int>>& jobs) {
2    sort(jobs.begin(), jobs.end(),
3         [](auto& a, auto& b) { return get<2>(a) > get<2>(b); });
4    int maxDeadline = 0;
5    for (auto& j : jobs) maxDeadline = max(maxDeadline, get<1>(j));
6    vector<int> slot(maxDeadline + 1, -1);
7    int profit = 0;
8    for (auto& [id, dead, p] : jobs) {
9        for (int t = dead; t >= 1; t--) {
10            if (slot[t] == -1) { slot[t] = id; profit += p; break; }
11        }
12    }
13    return profit;
14}

复杂度分析

时间 O(n log n)
空间 O(n)
最优 O(n)
最坏 O(n log n)

算法讲解

每个作业有一个截止时间和利润,同一时间只能做一个作业,目标是使总利润最大。

贪心策略是按利润从大到小排序,依次把作业安排在其截止时间之前最晚的空闲槽位。

如果截止时间之前所有槽位都被占用,就放弃这个作业。

并查集可以用来加速空闲槽位的查找,把时间复杂度降到接近 O(n)。