牛客小白月赛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类似,这里就不写了。