题目链接:http://poj.org/problem?id=2456
题意:有一排n个牛舍,坐标分别为xi,有m头牛,希望尽可能把他们之间分开,求他们之间最近的两头牛之间的距离最大可以拉到多少。这是二分中最大化最小值的题目,英文的题目又最大又最小有的人不易理解。
思路:显然两头最近的牛的距离太大将没有一种方式安置在牛舍中,两头最近的牛距离越小就越能放置在牛舍中,所以用把答案二分出来,每个mid要模拟放置暴力下可不可以放得下。
//532K 188MS
#include<cstdio>
#include<iostream>
#include<algorithm>
#define inf 1000001000
using namespace std;
int n,m;
int a[100100];
bool ok(int x)
{
int cnt=1;
int tmp=a[1];
while(cnt!=m){
tmp+=x;
int *p=lower_bound(a+1,a+1+n,tmp); //这里不需要用,只不过练习下这个函数。
if(p==a+1+n) return false;
tmp=*p;
cnt++;
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int lb=0,ub=inf;
while(ub-lb>1){
int mid=(lb+ub)/2;
if(ok(mid)){
lb=mid;
}
else ub=mid;
}
printf("%d\n",lb);
return 0;
}
总结一下对于整数二分的模版:
把lb和ub选在有意义的区间之外,然后二分条件是ub-lb>1, mid满足就直接赋给lb(或ub),不满足就直接赋给ub(lb)