任务混部(200 分档)

题目描述

某服务器上有 n 个计算任务,第 i 个任务从第 s[i] 秒开始,到第 e[i] 秒结束(闭区间 ),需要占用 c[i] 个计算单元。任务之间可能重叠,服务器必须保证任意时刻都有足够算力。求整个运行期间同一时刻被占用计算单元总数的最大值。

数据范围: 1 ≤ n ≤ 1000,0 ≤ s ≤ e ≤ 10000,1 ≤ c ≤ 100。

示例

复制代码
输入:
3
1 3 2
2 4 3
5 6 1

输出:
5

说明:第 2~3 秒时,任务1与任务2同时运行,占用 2+3=5 个计算单元,为最大值。

思路

经典的"差分数组 + 前缀和":

  • 对每个任务,在 diff[s] 处加 c,在 diff[e+1] 处减 c;
  • 对差分数组做前缀和,扫一遍即可得到每一时刻的实际占用量,取最大值。

C 代码

复制代码
#include <stdio.h>

#define MAXT 10001          /* 时间范围 0~10000 */

long long diff[MAXT + 2];   /* 差分数组 */

int main(void)
{
    int n;
    if (scanf("%d", &n) != 1) return 0;

    for (int i = 0; i < n; i++) {
        int s, e, c;
        scanf("%d %d %d", &s, &e, &c);
        diff[s]     += c;   /* s 时刻开始占用 */
        diff[e + 1] -= c;   /* e+1 时刻撤销(闭区间 [s, e]) */
    }

    long long cur = 0, ans = 0;
    for (int t = 0; t < MAXT; t++) {
        cur += diff[t];     /* 前缀和 = t 时刻的实际占用量 */
        if (cur > ans) ans = cur;
    }

    printf("%lld\n", ans);
    return 0;
}
相关推荐
企业数字化笔记3 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!4 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小郎君6586 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧6 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
Shimeri7 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J8 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang8 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖8 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy8 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化
上班摸鱼下班游戏8 小时前
Unity 仿生智能算法 从蚁群算法 开始
算法·unity·游戏引擎