Description
Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...,xN (0 <= xi <= 1,000,000,000).
His C (2 <= C <= N) cows don't like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?
His C (2 <= C <= N) cows don't like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?
Input
* Line 1: Two space-separated integers: N and C
* Lines 2..N+1: Line i+1 contains an integer stall location, xi
* Lines 2..N+1: Line i+1 contains an integer stall location, xi
Output
* Line 1: One integer: the largest minimum distance
Sample Input
5 3 1 2 8 4 9
Sample Output
3
Hint
OUTPUT DETAILS:
FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3.
FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3.
Huge input data,scanf is recommended.
#include<iostream>
#include<cstdio>
#include<algorithm>
long long a[100010];
long long N,C;
using namespace std;
int search(int mid)
{
long long last=a[0];
int cnt=1; //第一个桩一定要放一头牛
for(int i=1;i<N;i++)
{
if(a[i]-last>=mid)
{
cnt++;
last=a[i];
}
}
return cnt;
}
int main()
{
cin>>N>>C;
for(long long i=0; i<N; i++)
scanf("%I64d",&a[i]);
sort(a,a+N);
int l=0; //上界
int r=a[N-1]-a[0]; //下界
int mid;
/*********************二分法模版 ************************/
while(l<=r) //上界不超过下界
{
mid=(l+r)/2;
if(search(mid)>=C) //如果牛都能放下,说明这个距离可能小了,要把它放大
l=mid+1; //在右区间继续查找
else //否则,说明这个距离大了,要把它缩小
r=mid-1; //在左区间继续查找
}
cout<<l-1<<endl; //最后找到符合条件的值后因为又进行了l=mid+1操作,所以要减1
/********************************************************/
return 0;
}