带权区间调度,优先级可负

思路

这是加权区间调度问题。

按结束时间排序,设 dp[i] 表示前 i 个任务能获得的最大优先级和。

转移:

  • 不选第 i 个:dp[i] = dp[i-1]

  • 选第 i 个:找到最后一个结束时间 ≤ 第 i 个任务开始时间的任务 j,dp[i] = max(dp[i], dp[j] + priority[i])

因为 priority 可能为负,所以可以不选任何任务,答案为 0 或正数。

代码

c

复制代码
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int start, end, priority;
} Task;

int cmp(const void *a, const void *b) {
    Task *x = (Task *)a;
    Task *y = (Task *)b;
    return x->end - y->end;
}

int max(int a, int b) {
    return a > b ? a : b;
}

int main() {
    int n;
    scanf("%d", &n);

    Task tasks[100005];
    for (int i = 0; i < n; i++)
        scanf("%d %d %d", &tasks[i].start, &tasks[i].end, &tasks[i].priority);

    qsort(tasks, n, sizeof(Task), cmp);

    int dp[100005];
    dp[0] = 0;

    for (int i = 1; i <= n; i++) {
        dp[i] = dp[i - 1];

        int l = 0, r = i - 1, pos = 0;
        while (l <= r) {
            int mid = (l + r) / 2;
            if (tasks[mid].end <= tasks[i - 1].start) {
                pos = mid + 1;
                l = mid + 1;
            } else {
                r = mid - 1;
            }
        }

        dp[i] = max(dp[i], dp[pos] + tasks[i - 1].priority);
    }

    printf("%d\n", dp[n]);
    return 0;
}
相关推荐
青梅味猪大肠3 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
其实防守也摸鱼18 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
Nuanyt19 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
w_zero_one1 天前
递归算法(一)
java·开发语言·算法
风影同志783241 天前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG1 天前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
地平线开发者1 天前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法
京东云开发者1 天前
从“会生成”到“能生产”:萤火虫 AIGC 平台的 AI Infra 实践
算法·aigc·产品
youshi66681 天前
PID——算法改进
算法