题目思路
这个问题要求找到一个半开区间,使得在这个区间内包含尽可能多的礼物。首先,我们需要将输入的礼物坐标按照从小到大的顺序进行排序。然后,我们可以使用双指针的方法来寻找最佳的区间。
代码
以下是代码解释:
#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;
}
标签:ABC326C,int,题解,long,maxn,Peak,ans,坐标
From: https://www.cnblogs.com/IOIAKmerlin/p/17832495.html