题目描述
某服务器上有 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;
}