题目信息
输入
第一行为活动的个数 N(1<=N<=1 000 000)
。
接下来 N 行为 Si
和 Fi(0<=Si<Fi<=2 000 000 000)
,分别代表第 i 个活动的开始时间和结束时间。活动 i 的区间段为 [Si,Fi)
输出
输出有一行 M ,为所需教室的最小数量。
测试样例
11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14
5
解答
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 1000005
int S[MAXN];
int F[MAXN];
int N;
int main()
{
//freopen("E://test.txt", "r", stdin);
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> S[i] >> F[i];
}
sort(S, S + N);
sort(F, F + N);
int ans = 0;
int tmpans = 0;
int i = 0;
int j = 0;
while (i < N && j < N)
{
if (S[i] < F[j])
{//遇到左
tmpans++;
i++;
ans = max(tmpans, ans);
}
else if (S[i] > F[j])
{
tmpans--;
j++;
}
else
{
j++;
i++;
ans = max(ans, tmpans);
}
}
cout << ans << endl;
return 0;
}
想法
设计数器,遇到左加一个,遇到右减一个,输出计数器最大值即可