#include<bits/stdc++.h> #define int long long #define endl '\n' usingnamespace std; constint N = 2e5 + 10; int n, d, a[N]; // 存放原数组 int dp[N * 10][2]; // dp[i][0/1] 表示,选到值 i 时,不删除 / 删除 i 时的最小删除数 int cnt[N * 10]; voidsolve(){ cin >> n >> d; int minn = 1e18, maxx = 0; for (int i = 1; i <= n; i++) cin >> a[i], minn = min(minn, a[i]), maxx = max(maxx, a[i]), cnt[a[i]]++; if (d == 0) { int res = 0; for (int i = minn; i <= maxx; i++) // 注意,i 可能没出现过,只要考虑 cnt[i] > 0,即出现过的 i if (cnt[i] > 0) res += cnt[i] - 1; cout << res << endl; return; } // 对于 minn -> minn + d - 1,这里面的数,没有 i - d 可以转移 // 故若要删除 i,则必须把所有 i 都删掉,即为 cnt[i] // 不删除 i 的话,那么值默认为 0 就行 for (int i = minn; i < minn + d; i++) dp[i][1] = cnt[i]; for (int i = minn + d; i <= maxx; i++) { // 如果不删 i // dp[i - d][0] + cnt[i - d] 要把 i - d 都删了 // dp[i - d][1] 已经把 i - d 删了 dp[i][0] = min(dp[i - d][0] + cnt[i - d], dp[i - d][1]); // 如果删 i // dp[i - d][0] + cnt[i] i - d 不删,把 i 全删了 // dp[i - d][1] + cnt[i] i - d 和 i 都删了 dp[i][1] = min(dp[i - d][0] + cnt[i], dp[i - d][1] + cnt[i]); } int res = 0; for (int i = maxx; i >= maxx - d + 1; i--) res += min(dp[i][0], dp[i][1]); cout << res << endl; } signedmain(){ ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr); int _ = 1; // cin >> _; while (_--) solve(); }