题目描述
你的团队中有 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; }