题解 CF1850D Balanced Round

题意

给你一个有 $n$ 个整数的序列 $a$,求最多需要删除多少个数才能让任意两个问题的绝对值之差小于等于 $k$。

分析

首先我们将序列 $a$ 排序。

经过分析,如果 $a_i-a_{i-1}>k$,那么 $a_i$ 左侧的都会被删除。

经过观察可以发现,我们可以算出最多保留多少个。

个数即为相邻两个绝对值小于等于 $k$ 的最大长度。

最后答案即为 $n$ 减去最多保留个数。

代码

//the code is from chenjh
#include<cstdio>
#include<algorithm>
int n,k;
int a[200002];
void solve(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    std::sort(a+1,a+n+1);
    if(n==1){puts("0");return;}//特判 n=1 时一定为 0。
    int ans=0,c=1;//连续段数至少为 1。
    for(int i=2;i<=n;i++)
        ans=std::max(ans,c=((a[i]-a[i-1]<=k)?c:0)+1);//如果绝对值小于等于 k,那么加一,否则归为 1。
    printf("%d\n",n-ans);//即 n 减去最大长度。
}
int main(){
    int T;scanf("%d",&T);
    while(T--) solve(); 
    return 0;
}
posted @ 2023-07-23 19:48  Chen_Jinhui  阅读(12)  评论(0)    收藏  举报  来源