牛客小白月赛24: B.组队 (排序&二分)
思路:排序后枚举左端点进行upper_bound,或者枚举右端点进行迭代。时间复杂度:O(nlogn)
SOL1(STL) :
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,k;
scanf("%d%d",&n,&k);
int a[n];
for(auto &i:a) scanf("%d",&i);
sort(a,a+n);
int ans=0;
for(int i=0;i<n;i++){
int p=upper_bound(a,a+n,a[i]+k)-a;
ans=max(ans,p-i);
}
printf("%d\n",ans);
}
return 0;
}
SOL2(迭代):
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,k;
scanf("%d%d",&n,&k);
int a[n];
for(auto &i:a) scanf("%d",&i);
sort(a,a+n);
int l=0,ans=1;
for(int r=1;r<n;r++){
while(a[r]-a[l]>k) l++;
ans=max(ans,r-l+1);
}
printf("%d\n",ans);
}
return 0;
}
此外还可以用队列实现迭代,方法与SOL2类似,这里就不写了。