#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int A[1000010];
int n,c,a;
bool check(int x)//判断此答案是否可行
{
int num=0;
int l=A[1];//l记录上一只牛的位置,开始时第一只牛一定在第一个牛栏
for(int i=2;i<=n;i++)//依次枚举每个牛栏
{
if(A[i]-l<x) num++;//若此距离不满足当前答案,那么需要的牛栏数+1,即把当前牛放到下一个牛栏
else l=A[i];//否则就更新上一次的牛栏位置 ,即上一头牛放的位置
if(num>a) return false;// 若需要牛栏数大于最大牛栏数,此答案不可行
}
return true;//反之,若需要牛栏数小于最大需要牛栏数,此答案可行
}
int main()
{
scanf("%d%d",&n,&c);
for(int i=1;i<=n;i++)
scanf("%d",&A[i]);
sort(A+1,A+n+1);//由于无序,需排序(sort默认从小到大,不用写规则)
a=n-c;//最大剩余牛栏数
int l=1;//二分的左界,从1开始,即可能情况的最小值
int r=A[n]-A[1];//二分右界,即可能情况的最大值
while(l+1<r)//若左<右,则继续二分答案
{
int mid=(l+r)/2;//二分 两区间分别为l ~ mid , mid ~ r;
if(check(mid)) l=mid;//若此答案可行,从mid ~ r区间继续查找(更大答案),即修改左界l=mid
else r=mid;//反之,若此答案不可行,从l ~ mid区间查找(合理答案),即修改左界l=mid
}
if(check(r)) printf("%d",r);//若可行解为右界,输出右界
else printf("%d",l);//若可行解为左界,输出左界
return 0;
}
/**************************************************************
Problem: 1910
User: admin
Language: C++
Result: Accepted
Time:90 ms
Memory:5984 kb
****************************************************************/