任意门
Problem Description
给一个整数数组 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≤109) 。
第二行包含 n 个整数 a1,a2,⋯,an(1≤ai≤109) 。
Output
T 行,每行一个整数 x ,代表每组数据的答案。
Sample Input
1
6 1
1 2 2 2 2 3
Sample Output
5
很巧妙的一题,纯暴力枚举
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int inf=-0x3f3f3f3f;
int n,k;
int a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
int ans=0,f=inf;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
for(int i=0;i<n;i++){
if(f==inf){
f=a[i]-k;
ans++;
}
else{
if(f+1<a[i]-k){
f=a[i]-k;
ans++;
}
else if(f+1<=a[i]+k){
f++;
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}