[ABC326C] Peak 题解

题目链接

题目思路

这个问题要求找到一个半开区间,使得在这个区间内包含尽可能多的礼物。首先,我们需要将输入的礼物坐标按照从小到大的顺序进行排序。然后,我们可以使用双指针的方法来寻找最佳的区间。

代码

以下是代码解释:

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
#define int long long
int a[maxn];
int sum[maxn];
int n,len;

// 去除重复的坐标
void uni(){
    int m=0;
    a[0]=-1;
    for(int i=1;i<=n;i++){
        if(a[i]!=a[i-1]) a[++m]=a[i];
    }
    n=m;
}

signed main(){
    ios::sync_with_stdio(0);
    cin>>n>>len;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    
    // 去除重复的坐标
    uni();
    
    int i=n,j=n,ans=0;
    while(i>=1&&j>=1){
        ans=max(ans,j-i+1); // 记录当前区间的长度
        if(j<i) i=j; // 如果 j < i,则将 i 设置为 j,表示需要向右移动 i 来扩大区间
        if(a[j]-a[i-1]<len) i--; // 如果区间长度小于 len,向左移动 i,扩大区间
        else j--; // 否则向左移动 j,缩小区间
    }
    cout<<ans;
    return 0;
}
posted @ 2023-11-19 16:47  merlinkkk  阅读(36)  评论(0)    收藏  举报