POJ T2456 Aggressive cows
题解:
可以套用二分搜索求解最优解的模型(这个博客)
题意是有N个牛舍,C头牛,给出的牛舍位置并不按顺序。因为牛之间会打架,所以要求两两牛之间能隔开的最大距离。(一头牛一个牛舍)。
这是二分搜索最大化最小值的例子。
C(d):安排牛的位置使得任意牛之间的距离大于等于d
1.牛舍位置无序,先排序
2. 第一头牛放入第一个牛舍
3.第i头牛放入Xj的牛舍,则第i+1头牛放入牛舍需满足Xj + d <= Xk
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1e5;
const int INF = 1e9;
int sta[MAXN+5],n,c;
bool vis[MAXN+5];
bool judge(int x){
int sp = 0;
for(int i = 1; i < c; ++i){
int np = sp+1;
while(np < n && sta[np] - sta[sp] < x)
np++;
if(np == n) return false;
sp = np;
}
return true;
}
void solve(){
int L = -1,R = INF;
while(R - L > 1){
int mid = (L + R)/2;
if(judge(mid)) L = mid;
else R = mid;
}
printf("%d\n",L);
}
int main(){
while(~scanf("%d%d",&n,&c)){
for(int i = 0; i < n; ++i)
scanf("%d",&sta[i]);
sort(sta,sta+n);
solve();
}
return 0;
}