从这里开始
Codeforces 940A Points on the line
题目大意
定义一个可重集的距离是它中间最大的两个数之间的差,特殊地,只有一个元素的可重集的距离为0。
给定一个可重集,问最少删掉多少个数使得它的距离小于等于d。
排序后单调指针扫,或者直接开桶计数。
Code
1 /** 2 * Codeforces 3 * Problem#940A 4 * Accepted 5 * Time: 15ms 6 * Memory: 2000k 7 */ 8 #include <bits/stdc++.h> 9 using namespace std; 10 typedef bool boolean; 11 12 int n, d; 13 int res; 14 int* ar; 15 16 inline void init() { 17 scanf("%d%d", &n, &d); 18 ar = new int[(n + 1)]; 19 for (int i = 1; i <= n; i++) 20 scanf("%d", ar + i); 21 } 22 23 inline void solve() { 24 sort (ar + 1, ar + n + 1); 25 int r = 1; 26 res = n - 1; 27 for (int i = 1; i <= n; i++) { 28 while (r < n && ar[r + 1] - ar[i] <= d) r++; 29 res = min(res, i + (n - r) - 1); 30 } 31 printf("%d", res); 32 } 33 34 int main() { 35 init(); 36 solve(); 37 return 0; 38 }