题意:
农夫有一个栅栏,包括n个隔间(给出其在栅栏的位置),C头牛,牛在同隔间会争斗,为防止它们争斗,给它们分隔间,让任意两头牛之间的最小距离尽可能大,求该最小距离。(最小距离最大值)
思路:
确定好左右区间,开始二分搜索最小距离的最大值,若满足要求,则扩大范围,否则缩小范围,直到找到为止
代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> int num[100005]; int n,m; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } int judge (int x) { int count =1,i; int temp = num[0]; for(i = 1;i < n;i++) { if(num[i] -temp >= x ) { temp = num[i]; count++; } if(count >= m) return 1; } return 0; } int main() { while(scanf("%d%d",&n,&m) != EOF ) { int i = 0; int mid,rmid,lmid; for(i = 0;i < n;i++) { scanf("%d",&num[i]); } qsort(num,n,sizeof(num[0]),cmp); lmid = 1; rmid = num[n-1]; while(lmid < rmid) { mid = (lmid+rmid)/2; if(judge(mid)) lmid = mid+1; else rmid = mid; } printf("%d\n",lmid-1); } return 0; }