给一个整数数组 a1,a2,⋯,an 和 k ,你想要找到一个最大的值 x ,使得存在另一个整数数组 b1,b2,⋯,bn 满足 |ai−bi|≤k(1≤i≤n) 且 bn 中共有 x 个不同的数。
Input
第一行一个正整数 T(1≤T≤10) ,代表测试组数。
接下来 T 组数据中,每组数据的第一行包含包含两个整数 n,k(1≤n≤100000,0≤k≤10^9) 。
第二行包含 n 个整数 a1,a2,⋯,an(1≤ai≤10^9) 。
Output
T 行,每行一个整数 x ,代表每组数据的答案。
Sample Input
1
6 1
1 2 2 2 2 3
Sample Output
5
题意
匹配一个b数组,这个数组满足|ai-bi|<=k,求出最大的x,x为b数组里不同的数的个数
思路
将a数组从大到小排序,先匹配出b数组中最大的数,然后依次遍历,查找符合条件的值,并且记录b数组中不同数值的个数
代码
#include<bits/stdc++.h>
using namespace std;
long long a[100010];
bool cmp(long long x,long long y)
{
return x>y;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d %d",&n,&k);
for(int i=1; i<=n; i++)
scanf("%lld",&a[i]);
sort(a+1,a+1+n,cmp);//从大到小排序
long long l=a[1]+k,ans=1;//l为b数组中最大的数,此时ans即要求的x即为1
for(int i=2; i<=n; i++)
{
if(a[i]+k<l)//符合条件的数值,并且数值不同,最大化x的值
{
l=a[i]+k;//更新l的值
ans++;//不同的数的个数++
}
else//如果当前的l不符合条件,l就依次减小
{
l--;
if(a[i]-l<=k)//符合条件就++
ans++;
else//a[i]-l>k说明l偏小了,就让l++,寻找符合条件的l
l++;
}
}
printf("%lld\n",ans);
}
return 0;
}