poj 2456(二分)
题意:
最大化最近的两头牛之间的距离。
题解:
关键:二分距离
假设可以安排牛的位置使临近的两头牛之间的距离都不小于 d
根据贪心的思想:
(1)对牛舍的位置进行从大到小排序。
(2)优先选取靠前的牛舍,因此第一头牛放入 1 号牛舍。
(3)如果第 i 头牛放入了第 i 号牛舍,则第 i+1 头牛就要放入满足 x[i]+d <= x[k] 的最小的 k 号牛舍中。
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1e5+50; 6 7 int N,C; 8 int x[maxn]; 9 10 int binarySearch(int val) 11 { 12 int l=0;int r=N+1; 13 while(r-l > 1) 14 { 15 int mid=l+((r-l)>>1); 16 if(x[mid] >= val) 17 r=mid; 18 else 19 l=mid; 20 } 21 return r; 22 } 23 bool Check(int m) 24 { 25 int index=1; 26 int total=0; 27 while(index <= N) 28 { 29 total++; 30 index=binarySearch(x[index]+m);//二分查找出满足下一头牛距离当前牛的距离 >= m 的最小的下标 31 } 32 return total >= C ? true:false; 33 } 34 35 int main() 36 { 37 scanf("%d%d",&N,&C); 38 for(int i=1;i <= N;++i) 39 scanf("%d",x+i); 40 sort(x+1,x+N+1); 41 //相邻两头牛间的可能距离范围为[l,r) 42 int l=0,r=1e9+50; 43 while(r-l > 1) 44 { 45 int mid=l+((r-l)>>1); 46 if(Check(mid))//如果mid满足条件,则范围变为[mid,r) 47 l=mid; 48 else 49 r=mid;//反之,范围变为[l,mid) 50 } 51 printf("%d\n",l); 52 return 0; 53 }