题目link:https://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 }