题解:P17687 [IO 2025 #2] 尼基塔与钓鱼
首先很容易发现一个性质,一定会在有鱼的坐标放船,这样不会更劣。
然后我们可以发现 \([x,x+k]\) 与 \([x-k,x]\) 其实是等价的,所以可以选择 \([x,x+k]\) 进行枚举。
考虑先把坐标排序,然后使用双指针枚举区间左端点和区间右端点即可,并打擂刷新答案即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1E5+5;
int n,k;
int a[MAXN];
int ans;
int main(){
cin>>n>>k;
for(int i=1;i<=n;++i)cin>>a[i];
sort(a+1,a+1+n);
int r=1;
for(int l=1;l<=n;++l){//考虑将每一个位置作为左端点
if(r<l)r=l;//保证r>=l
int t=a[l]+k;//寻找的坐标
while(a[r]<=t&&r<=n)r++;
ans=max(ans,r-l);
}
cout<<ans<<endl;
return 0;
}
/*
很容易发现一个性质,一定会在有鱼的坐标放船,这样不会更劣。
*/

浙公网安备 33010602011771号