题目链接: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; }
时间: 2024-10-18 16:22:24