题目描述
你的团队中有 nn 个人,每个人有一个能力值 ai,现在需要选择若干个人组成一个团队去参加比赛,由于比赛的规则限制,*一个团队里面任意两个人能力的差值必须要小于等于 k *,为了让更多的人有参加比赛的机会,你最多能选择多少个人参加比赛?

输入描述:
第一行一个整数 T,表示案例组数。

每个案例有两行:

第一行两个正整数 n,kn,k ,表示人的数量。

第二行n个以空格分隔的整数 ai ,表示每个人的能力值。

输出描述:

每个案例输出一行,表示可以参加比赛的最多人数。

思路:我们首先要抓住的重点是任意两个人的差值都得小于等于k,所以如果我们选择了这样的一个集合,那么集合里面的最大值跟最小值之差也是 <= k。所以我们可以对能力值进行排序,然后的话我们遍历能力值,在有序的能力值中我们找到大于当前能力值加上k的那个位置,然后得到长度,更新维护即可。

二分

#include<bits/stdc++.h>
#define maxn 500010
using namespace std;
typedef long long ll;

ll a[maxn];


int  main(){
    int t;
    cin>>t;
    while(t--){
        int tot =0;
        int res = -0x3f3f3f3f;
        ll n,k;
        cin>>n>>k;
        for(int i=0;i<n;i++){
            cin>>a[i];
    }
        sort(a,a+n);
        for(int i=0;i<n;i++){
            int ans = upper_bound(a,a+n,a[i]+k) - a;
            res = max(res,ans - i);
    }
        cout<<res<<endl;
    }
    return 0;
}