题意:
给定n个数,从中挑出c个, 让他们相邻两数的最小距离最大。
分析:
先将n个数排序, 然后我们知道两个数的距离的范围d ∈[1,n/c + 1], 我们去二分这个范围, 然后去判断mid是否可行。
判断方法是从第一个点开始放, 找到一个不少于d的点再试, 最后如果能放满证明可行,d的下限为mid+1,若不行d的上限为mid-1。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int maxn = 1e5 + 7; 5 int a[maxn]; 6 int n , c; 7 bool judge(int k){//判断是否可行可以从一个点逐步递增 8 int sum = 0, picked = 1; 9 for(int i = 1; i < n; i++){ 10 if(sum + (a[i] - a[i-1]) < k) 11 sum += a[i] - a[i-1]; 12 else{ 13 sum = 0; 14 picked++; 15 } 16 if(picked >= c)return true; 17 } 18 return false; 19 } 20 int main(){ 21 while(~scanf("%d %d", &n, &c)){ 22 for(int i = 0; i < n; i++) scanf("%d", &a[i]); 23 sort(a , a + n); 24 int L = 1, R = a[n-1]/c + 1; 25 while(L <= R){ 26 int mid = (L+R) / 2; 27 if(judge(mid)) L = mid + 1; 28 else R = mid - 1; 29 } 30 printf("%d\n", R); 31 } 32 return 0; 33 }