题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4004
题意: 长度为L的河中间有n个石头第i个石头到起点的距离为A[I]求青蛙每一步最少跳多远.
分析:最少每一步跳0,最长为L因此我们只需要二分每一步的步长即可。然后判断是否符合条件即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 500001;
int a[maxn],l,n,m;
bool judge(int x)
{
int dis=0,step=0,now=0,next=1;
while(step<m){
while(x>=a[next]-a[now]){
next++;
if(a[next-1]==l) break;
}
now=next-1;
dis=a[now];
if(dis>=l) break;
step++;
}
if(dis<l) return false;
return true;
}
int bin_search()
{
int ll=0,rr=l;
int mid;
while(ll<=rr){
mid=(ll+rr)>>1;
if(!judge(mid)) ll=mid+1;
else rr=mid-1;
}
return rr+1;
}
int main()
{
while(~scanf("%d%d%d",&l,&n,&m)){
a[0]=0;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
a[n+1]=l;
sort(a,a+n+2);
printf("%d\n",bin_search());
}
return 0;
}