AtCoder ABC326C 题解

题目链接

问题陈述

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;
}
posted @ 2025-01-22 19:20  ZaleClover  阅读(54)  评论(0)    收藏  举报