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

思路

这是加权区间调度问题。

按结束时间排序,设 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;
}
相关推荐
重生之小比特1 小时前
【算法拾光】双指针|三数之和 + 四数之和
算法
我爱工作&工作love我1 小时前
P14359 [CSP-J 2025] 异或和
算法
茉莉玫瑰花茶1 小时前
GO [ 数据格式 ]
服务器·网络·算法·golang
小poop1 小时前
高级排序算法与性能对比——归并、非比较排序及总结
数据结构·算法·排序算法
aqiu1111111 小时前
CodeTop按顺序刷题0003:LeetCode 206. 反转链表(迭代法图文详解与动态演示)
算法·leetcode·链表
果霸大叔1 小时前
AI网关第8篇:AI 代理与负载均衡--多模型实例如何调度?
人工智能·算法·自然语言处理·负载均衡·ai-native
不会就选b2 小时前
算法日常・每日刷题--<动态规划>29
数据结构·算法·leetcode
垆边人似月.2 小时前
最少的元素个数使和为 target
数据结构·c++·算法
炽橙超真云2 小时前
2D 工程图纸如何自动转成可编辑 3D 模型?拆解读图与建体两条技术路径(DXF/DWG/PDF 到 STEP)
算法·3d·工业智能·工业ai