牛栏(aggr)
Time Limit:10000MS Memory Limit:65536K
Total Submit:129 Accepted:72
Description
FJ新建了一个有N(2 <= N <= 100,000)个畜栏的畜棚.畜栏的位置分布在直线的点x_1, ..., x_N (0 <= x_i <= 1,000,000,000)上.
他的C(2 <= C <= N)只牛不喜欢这个畜棚的设计并且对在同一个畜栏里的其他牛进行攻击。为了防止牛受到伤害,FJ想把这些牛分配到某些畜栏中,使得这些牛所在的任意两个畜栏之间的最短距离尽可能长。求最长的最短距离是多少?
Input
*第1行:两个用空格隔开的整数:N和C
*第2到N+1行:每行包括一个整数,畜栏的位置:X_i
Output
*第一行:一个整数:最长的最短距离
Sample Input
5 3
1
2
8
4
9
Sample Output
3
样例解释:
FJ把3只牛放到位置是1、4和8的畜栏里,最短距离是3。
Source
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
long long n,a[100010],c;
bool check(int m)
{
int start=1,end=2,num=1;
while(1)
{
if(start>n||end>n) break;
if(a[end]-a[start]>=m)
{
start=end;
end++;
num++;
}
else end++;
}
return num>=c;
}
int er(int lo,int hi)
{
while(lo+1<hi)
{
int mid=(lo+hi)/2;
if(check(mid)) lo=mid;
else hi=mid;
}
return lo;
}
int main()
{
cin>>n>>c;
for(int i=1;i<=n;i++)
{
scanf("%I64d",&a[i]);
}
sort(a+1,a+1+n);
cout<<er(0,a[n]+1);
return 0;
}