题目链接
问题陈述
Takahashi 在数字线上放置了 \(N\) 个礼物。第 \(i\) 个礼物放置在坐标 \(A_i\) 处。
您将在数轴上选择长度为 \(M\) 的半开区间 \([x,x+M)\),并获得其中包含的所有礼物。
更具体地说,你根据以下程序获得礼物。
-
首先,选择一个实数 \(x\)。
-
然后,获取坐标满足 \(x\ \le\ A_i\ <\ x+M\) 的所有礼物。
您最多可以获得多少份礼物?
思路
先给 \(A\) 数组排序,然后遍历 \(A\) 数组,通过二分查找以 \(A_i\) 为开头,长度为 \(M\) 的区间内最后一个礼物所在位置的编号 \(j\) 。
\(j-i+1\) 即是以 \(A_i\) 为开头,长度为 \(M\) 的区间内礼物个数,将当前最优解 \(ans\) 与 \(j-i+1\) 取最大值更新 \(ans\) ,最后的 \(ans\) 即是本题答案
代码如下:
#include <bits/stdc++.h>
#define N 300010
using namespace std;
int n, m, ans, a[N];
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);sort(a + 1, a + n + 1);for (int i = 1; i <= n; i++) {int j = lower_bound(a + 1, a + n + 1, a[i] + m) - a - 1;ans = max(ans, j - i + 1);}printf("%d\n", ans);return 0;
}