#include <iostream>
#include <stdio.h>
#include <algorithm>
long long a[100005],n,c;
using namespace std;
bool judge(long long d)
{
int f,r,t=1;
f=r=1;
while (r<n)
{
while (a[r]-a[f]<d&&r<n) r++;
if (a[r]-a[f]>=d) t++;
f=r;
}
if (t>=c) return true;else return false;
}
int main()
{ long long left,right,mid;
freopen("in.txt","r",stdin);
cin>>n>>c;
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
sort(a+1,a+n+1);
left=1;right=a[n]/c;
while (right-left>1) /*最后left,right挨在一起*/
{
mid=(left+right)/2;
if (judge(mid)) left=mid;
else right=mid;
}
if (judge(right))cout<<right;else cout<<left;/*对剩下两个分别判断*/
return 0;
}
题目大意:最大化最小值
FJ 有一个很长的 barn ,然后里面有 N 棚, N 个棚在一条直线上,第 i 个棚的位置为 xi.
然后他有 c 只羊,为了防止羊相互攻击,则要找出最大的两只羊之间距离,前提是这 c 只羊都必须能放下哈。
解题思路:先将 xi 由小到大排序, xn 最大。设这个最大距离为 s;0<s<=(xn-x1)/(c-1), 因为 c 只羊需要 c-1 个间隔。使用二分找 s 的可能取值,然后用贪心看是否成立。
Left=0;
right=(xn-x1)/(c-1);
mid=(left+right)/2; 如果间隔 mid 能够放下 c 只羊,则最大间隔在 [mid,right] ;
否则 [left,mid-1]. 继续寻找。