CF1850D题解

由于限制是在相邻的两个数上,所以考虑从小到大排序,这样可以最小化相邻两个数的差的绝对值。

我们可以把排序后的序列分成若干段,每段段内两两之差的绝对值一定是小于等于 kk 的,而不同段的两个数之差一定是大于 kk 的。

显然,我们只能保留一段,由于要划去最少得数,所以要保留最长的那一段。

#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;
}
posted @ 2023-07-23 11:20  fengxiaoyi  阅读(18)  评论(0)    收藏  举报  来源