题目描述 :给定 n 条请求日志,每条日志包含请求开始时间 start 和结束时间 end(单位:秒,均为整数,0 ≤ start ≤ end ≤ 10^9)。求在任意时刻,同时进行的请求最大数量。
输入:
-
第一行:
n(1 ≤ n ≤ 10^5) -
接下来
n行:每行两个整数start end
输出:一个整数,表示最大并发数。
示例:
text
输入:
3
1 3
2 4
3 5
输出:
2
解释:时刻 2~3 之间有 2 个请求同时进行。
解题思路
经典"会议室"问题。把每个请求拆成两个事件:start 时 +1,end 时 -1。但要注意结束和开始在同一时刻是否算重叠 ------本题按"左闭右开"处理,即 end 时刻请求已结束,不算重叠。因此排序时,若时间相同,结束事件排在开始事件之前。
-
将所有事件按时间排序,时间相同则
-1优先。 -
遍历事件,维护当前并发数
cur,记录最大值max。
参考代码
c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int time;
int delta; // +1 开始, -1 结束
} Event;
int cmp(const void *a, const void *b) {
Event *x = (Event *)a, *y = (Event *)b;
if (x->time != y->time) return x->time - y->time;
return x->delta - y->delta; // -1 排在 +1 前面
}
int main(void) {
int n;
scanf("%d", &n);
Event *ev = (Event *)malloc(sizeof(Event) * 2 * n);
for (int i = 0; i < n; i++) {
int s, e;
scanf("%d %d", &s, &e);
ev[2*i].time = s; ev[2*i].delta = 1;
ev[2*i+1].time = e; ev[2*i+1].delta = -1;
}
qsort(ev, 2*n, sizeof(Event), cmp);
int cur = 0, max = 0;
for (int i = 0; i < 2*n; i++) {
cur += ev[i].delta;
if (cur > max) max = cur;
}
printf("%d\n", max);
free(ev);
return 0;
}