POJ 2456 - Aggressive cows ( 二分:最大化最小值 )
题意
n间屋,m头牛,使得牛跟牛之间的距离最远,防止牛打架
思路
类似的最大化最小值或者最小化最大值的问题,通常用二分搜索法就可以很好地解决。
solve(d): 可以安排牛的位置使得最近的两头牛距离不小于d
那么问题就变成了求满足solve(d)的最大的d
另外, 最近的间距不小于d也可以说是所有牛的间距都不小于d
solve(d): 可以安排牛的位置使得任意的牛的间距都不小于d
AC代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 1e5+5;
int s[maxn];
int n, k;
bool judge(int d){
int a, b;
b = 0;
for(int i = 1; i < k; i++ ){
a = b + 1;
while( a < n && s[a] - s[b] < d )
a++;
if( a == n ) return false;
b = a;
}
return true;
}
int main()
{
scanf("%d%d", &n, &k);
for(int i = 0; i < n; i++)
scanf("%d",&s[i]);
sort(s, s+n);
int lb = 0, ub = INF;
int mid;
while(ub-lb>1){
mid = (lb+ub)/2;
if( judge(mid) ) lb = mid;
else ub = mid;
}
printf("%d\n", lb);
return 0;
}