题目:
农夫 John 建造了一座很长的畜栏,它包括NN (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,…,xN (0 <= xi <= 1,000,000,000). 但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢
Input
第一行:空格分隔的两个整数N和C
第二行—第N+1行:i+1行指出了xi的位置
Output第一行:一个整数,最大的最小值
Sample Input
5 3
1
2
8
4
9
Sample Output
3
把牛放在1,4,8这样最小距离是3
做法:将隔间排序,得到第一个隔间和最远的隔间之间的距离,然后对这个答案进行二分,如果当前的mid能符合题目的条件就在(mid,r]中间找,如果不信就去[l,mid)找。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,c,a[100010];
int check(int x)
{
int t=a[1],ans=1;
for (int i=2;i<=n;i++)
{
if (a[i]-t>=x)
{
ans++;
t=a[i];
}
}
if (ans>=c) return 1;
else return 0;
}
int main()
{
cin>>n>>c;
for (int i=1;i<=n;i++)
scanf("%d",a+i);
sort(a+1,a+1+n);
int l=0,r=a[n]-a[1],mid,ans;
while (l<=r)
{
mid=(l+r)/2;
if (check(mid))
{
l=mid+1;
ans=mid;
}
else
{
r=mid-1;
}
}
cout<<ans;
}