原题: http://acm.nyist.net/JudgeOnline/problem.php?pid=586
//nyoj 586
//即从n个栅栏中选k个,使得这k个栅栏之间的距离要尽可能地大
//贪心:要使得任意两个栅栏之间的距离最大,只需要使依次的两个栅栏之间的距离最大,即栅栏1和栅栏2最大,栅栏2根栅栏3最大....就可以保证每两个距离最大
// 而数目已知为k,结果的范围也已知,用二分+贪心查找
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<math.h>
using namespace std;
int cmp(const void *aa,const void *bb)//由小到大
{
int a=*(int *)aa;
int b=*(int *)bb;
return a>b;
}
int n,k;
int z[100001];
int greed(int span)//贪心,假设span是最大距离情况中最小的距离
{
int cnt=1;
int now=z[0]+span;
for(int i=1;i<n;i++)
{
if(z[i]>=now)
{
now=z[i]+span;
cnt++;
}
}
if(cnt>=k)return 1;
return 0;
}
int main()
{
while(~scanf("%d %d",&n,&k))
{
for(int i=0;i<n;i++)
{
scanf("%d",&z[i]);
}
qsort(z,n,sizeof(z[0]),cmp);
int r=z[n-1]-z[0];//结果范围在l~r
int l=0;
int rs;
while(l<=r)//二分
{
int mid=(l+r)/2;
if(greed(mid))
{
rs=mid;
l=mid+1;
}else{
r=mid-1;
}
}
printf("%d\n",rs);
}
return 0;
}