合肥市第38届信息学竞赛(2021年)
题目描述 Description
在一条道路上有很多从 1 开始依次编号的老鼠最爱的美食,假设每种美食都有无限多,而老鼠们随机闪现在任一个美食旁,然后依次尝试美食,至少需要尝试到第一次出现时的下一个美食为止,求哪两种相邻的美食被老鼠们尝试的次数最多,输出最多的次数即可。保证每只老鼠出现和停止的美食编号都不同。
输入描述 Input Description
有 n+1 行,第一行表示老鼠数量 n,
接下来 n 行每行都有两个数,分别表示老鼠第一次出现的美食编号,和停止的美食编号
输出描述 Output Description
一行,一个正整数,表示最多的次数。
样例输入 Sample Input
3 1 4 2 5 3 7
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
2≤n≤10000,美食种类保证在 int 范围内,每只老鼠出现和停止的美食编号都不同。
样例解释:
共有 3 只老鼠,第一只依次尝试了 1-2-3-4 共 4 种美食;第二只依次尝试了2-3-4-5 共 4 种美食;第三只依次尝试了 3-4-5-6-7 共 5 种美食。相邻的 3-4美食被尝试了 3 次。
这题使用了差分的思想,使计算更快捷。
上代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct MOUSE {
int bh, f;
}a[20005];
bool cmp(MOUSE x, MOUSE y) {
if (x.bh != y.bh) {
return x.bh < y.bh;
}
return x.f < y.f;
}
int n, x, y;
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> x >> y;
a[i].bh = x;
a[i].f = 1;
a[i + n].bh = y + 1;
a[i + n].f = -1;
}
sort(a + 1, a + 2 * n + 1, cmp);
int tmp = 0, ans = -1;
for (int i = 1; i <= 2 * n; i++) {
tmp += a[i].f;
ans = max(ans, tmp);
}
cout << ans;
return 0;
}