- 题目大意
农夫约翰搭了一间有n间牛舍的小屋。牛舍排在一条线上第i号牛舍在xi的位置。但是他的m头牛对小屋很不满意,因此经常互相攻击。约翰为了防止牛之间互相伤害,因此决定把每头牛都放在离其他牛尽可能远的牛舍。
- 解题思路
很明显是一个最大值最小化的问题,因此我们可以假设C(d)为满足所有牛之间的距离都不小于d。先对牛舍的位置排序,然后二分枚举d,寻找满足条件的d。
- 代码
#include<iostream>
#include<algorithm>
using namespace std;
const int MAX = 100001;
int n, m;
int num[MAX];
bool find(int d)
{
int last = 0;
for (int i = 1; i < m; i++)
{
int crt = last + 1;
while (crt < n&&num[crt] - num[last] < d)
{
crt++;
}
if (crt == n)
return false;
last = crt;
}
return true;
}
int main()
{
cin >> n >> m;;
for (int i = 0; i < n; i++)
cin >> num[i];
sort(num, num + n);
int lb = 0,ub = (num[n-1]-num[0])/(m-1);
while(ub-lb>1)
{
int mid = (lb + ub) / 2;
if (find(mid))
lb = mid;
else
ub = mid;
}
cout << lb<<endl;
return 0;
}