#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[50001]={0},l,n,m;
bool judge(int mid)
{
int start=0,x=0;//用start表示每次落脚点的坐标,每落一次地更新一次start
for(int i=1;i<=n;i++)
{
if(a[i]-start<mid)
x++;//x表示去掉的石头数,如果mid大于要跳的距离,就跳过当前这个石头,此时x++ ,并且不落地
else
start=a[i];//此时落地!
}
if(l-start<mid||x>m)//判断最后一跳跳的距离要是小于mid的话那是不可以的
return false;
return true;
}
int main()
{
while(cin>>l>>n>>m)
{
int left=0,right=l,mid,ans;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a,a+(n+1));
while(right>=left)
{
mid=(left+right)/2;//mid表示最小的距离!
if(judge(mid))
left=mid+1;
else
right=mid-1;
}
cout<<mid<<endl;
}
return 0;
}
POJ - 3258
最新推荐文章于 2022-02-21 21:05:44 发布