欢乐赛 #66 T6 题解
2026-02-08 22:56:05
发布于:北京
28阅读
0回复
0点赞
使用双指针解决。
先将 从小到大排序。
初始时,左指针 与当右指针 的值均为 。
当 时:
- 不断右移 直到此区间最大最小差超过 ;
- 计算此区间最大最小差超过 之前的长度,与最大值比较;
- 不断右移 直到此区间最大最小差不超过 ;
- 计算此区间长度,与最大值比较(因为可以证明,此区间长度一定不超过之前的区间长度,所以可以省略)。
#include <bits/stdc++.h>
using namespace std;
int n,y,ans;
int a[1000005];
int main(){
cin>>n>>y;
for (int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int l=1,r=1;
while (r<=n){
while (a[r]-a[l]<=y&&r<=n){//边界条件
r++;
}
ans=max(r-l,ans);//此时区间长度为符合题意的区间长度 +1,所以不需要 r-l+1
while (a[r]-a[l]>y){
l++;
}//补充说明一下,之前的区间长度只增加了 1,而此区间长度至少增加 1,所以不需要比较
}
cout<<ans;
return 0;
}
这里空空如也







有帮助,赞一个