CF1850D题解
由于限制是在相邻的两个数上,所以考虑从小到大排序,这样可以最小化相邻两个数的差的绝对值。
我们可以把排序后的序列分成若干段,每段段内两两之差的绝对值一定是小于等于 的,而不同段的两个数之差一定是大于 的。
显然,我们只能保留一段,由于要划去最少得数,所以要保留最长的那一段。
#include<bits/stdc++.h>
using namespace std;
int t,n,k,a[200010];
bool cmp(int x,int y){
return x<y;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+n+1,cmp);
int ans=0,sum=0;
for(int i=1;i<=n;i++){
if(sum==0||a[i]-a[i-1]<=k) sum++;
else{
ans=max(ans,sum);
sum=1;
}
}
ans=max(ans,sum);
printf("%d\n",n-ans);
}
return 0;
}

浙公网安备 33010602011771号