有N间牛舍,排在一条线上,有M头奶牛,彼此不待见,会相互攻击,请问为使得每头牛离其他牛尽可能远,那么两头牛之间的最小距离是多少。
又是一题二分搜索法,确定一个最小距离mib,尝试排布,返回bool值作为二分搜索的判断依据。
题源来自《挑战程序竞赛》第二版 142页。
//
// 142_aggressive cows.cpp
// changlle
//
// Created by user on 1/8/16.
// Copyright (c) 2016 user. All rights reserved.
//
#include <iostream>
using namespace std;
const int INF=100;
int N=5;
int M=3;
int x[5]={1,2,8,4,9};
bool C (int d) {
int last=0;
int now=0;
for (int i=2;i<=M;i++) {
while (now<N && x[now]-x[last]<d)
now++;
last=now;
}
return now<N;
}
void solve() {
int lb=0,ub=INF;
int mib=0;
sort (x, x+N);
while(ub-lb>1) {
mib=(lb+ub)/2;
if (C(mib))
lb=mib; //最后成功的是lb
else
ub=mib;
}
cout<<lb<<endl;
}
int main () {
solve();
return 0;
}