CF1850D

根据题意,不难想到贪心,将 \(a\) 从小到大排序,使得相邻两数之差的绝对值尽可能小。若存在两数之差的绝对值大于 \(k\),则将两数之间作为一个“分界线”。在确定所有“分界线”后,序列被分成了多个子段,这些子段中最多保留一个才能满足条件。根据贪心,选择保留最长的一段,用 \(n\) 减去其长度即为答案。


#include <bits/stdc++.h>
#define int long long

using namespace std;

int a[1000001];

signed main()
{
    int T,n,k,cnt,ans;
    cin >> T;
    while( T -- )
    {
        cin >> n >> k;
        for( int i = 1 ; i <= n ; i ++ )
            cin >> a[i];
        sort( a + 1 , a + n + 1 );
        cnt = 1;
        ans = 1;
        for( int i = 2 ; i <= n ; i ++ )
            if( a[i] - a[i - 1] > k )
            {
                ans = max( ans , cnt );
                cnt = 1;
            }
            else cnt ++;
        ans = max( ans , cnt );
        cout << n - ans << endl;
    }
    return 0;
}
posted @ 2024-01-20 18:14  liyilang2021  阅读(2)  评论(0编辑  收藏  举报