一本通 1.2 例 1【愤怒的牛】

题目linkhttps://loj.ac/problem/10011

求最大的距离最小,典型的二分题。二分答案距离,然后贪心判断是否可行即可。别忘了要先排序。

 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 int n, m, a[100010];
 5 int check(int x)
 6 {
 7     int t = a[1], cnt = 1;
 8     for(int i = 2; i <= n; ++i)
 9     {
10         if(a[i] - t >= x) ++cnt, t = a[i];
11         if(cnt >= m) return 1;
12     }
13     return 0;
14 }
15 int half()
16 {
17     int ans = 0, l = 0, r = 1e9 + 10;
18     while(l <= r)
19     {
20         int mid = (l + r) >> 1;
21         if(check(mid)) ans = mid, l = mid + 1;
22         else r = mid - 1;
23     }
24     return ans;
25 }
26 int main()
27 {
28     scanf("%d %d", &n, &m); for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
29     sort(a + 1, a + n + 1);
30     printf("%d", half());
31     return 0;
32 }

 

posted @ 2020-11-01 19:58  louis_11  阅读(131)  评论(0编辑  收藏  举报