/* poj3258 River Hopscotch
牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离,
现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值。
二分一下距离
牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离,
现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值。
二分一下距离
用左侧的石头和右边的比较,如果小于二分出的距离,就把石头拿掉,记录数量;如果超过距离,就按上面的方法比较
后面的。
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int m,n,l,r;
int a[50005];
bool judge(int x)
{
int i,j = 0;
int cont = 0;
for(i=1;i<=n+1;i++)
{
if(a[i] - a[j] < x)
{
cont++;
if(cont>m)
return false;
}
else
j = i;
}
return true;
}
int binarysearch()
{
while(l < r)
{
int mid = l + (r - l + 1)/2;
if(judge(mid))
l = mid;
else
r = mid - 1;
}
return l;
}
int main(void)
{
int i;
while(scanf("%d%d%d",&a[0],&n,&m)==3)
{
r = a[0];
l = 1;
a[1] = 0;
for(i=2;i<=n+1;i++)
scanf("%d",&a[i]);
sort(a,a+n+2);
printf("%d\n",binarysearch());
}
return 0;
}