先排序,然后遍历,更新Min即可,这才是签到题……
for(int i=1;i<n;i++){
int a = shu[i];
if(a + k >= Min){//可以有一种当前数字带来的新种类
Min = max(Min+1,a-k+1);
ans++;
}
//如果这个条件不满足,说明在[a-k,a+k]的数字在前面都出现过了
}
完整代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int shu[100000+100];
int main(){
int t;
scanf("%d",&t);
while(t--){
long long ans = 0;
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&shu[i]);
}
sort(shu,shu+n);
int Min = shu[0] - k + 1;
ans++;
for(int i=1;i<n;i++){
int a = shu[i];
if(a+k>=Min){
Min = max(Min+1,a-k+1);
ans++;
}
}
printf("%lld\n",ans);
}
return 0;
}