题意是说有N间小屋,M头牛,现在要将M头牛关在N间小屋里面,(N>=M),因为牛对自己的房屋不是很满意,所以会将
对房屋的不满转向同伴,会以攻击身边的同伴来解气,为此,为了让它们不要互相伤害,需要将M头牛适当的安排在这N
间房屋里面,首先将第一头牛关在0号房间,而后不断更新这个最大可以安排的距离(d),用到二分查找值的算法,不断
二分直到不满足C(d),这是结束运行,得到结果。
#include<iostream>
#include<algorithm>
#define INF 9999999
using namespace std;
int N, M;
int x[100001];
//judge if it is
bool C(int d){
int pre = 0;
for (int i = 1; i < M; i++){
int cur = pre + 1;
while (cur < N&&x[cur] - x[pre] < d){
cur++;
}
if (cur == N){
return false;
}
pre = cur;
}
return true;
}
int main()
{
while (cin >> N >> M){
//input
for (int i = 0; i < N; i++){
cin >> x[i];
}
//sort the array x
sort(x, x + N);
int lb = 0, ub = INF;
for (int i = 0; i < 100; i++){
int mid = (lb + ub) / 2;
if (C(mid)){
lb = mid;
}
else{
ub = mid;
}
}
cout << lb << endl;
}
return 0;
}