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 }
Problem A

相关文章: