题意:现在要过一条河,河上有石头可以借助着石头跳过河。但是只能跳跃m次跳跃的距离没有限制。要求使最大的跳跃尽可能的小,问可能的最大的跳跃距离中最小的
思路:开始认为是动态规划或者贪心,然后进了死胡同。其实是二分变形,对距离进行二分查找
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxN 500010
int key[maxN],n,m,suml;
int d(int k){
int len=0,cnt=0;
for(int i=0;i<=n;i++)
if(key[i]<len+k&&key[i+1]>len+k)
len=key[i],cnt++;
else if(key[i]==len+k)
len=key[i],cnt++;
if(len>=suml&&cnt<=m)return 1;
else return 0;
}
int fun(int l,int r)
{
if(l>r)
return r+1;
else{
int mid=(r+l)/2;
if(d(mid))
return fun(l,mid-1);
else
return fun(mid+1,r);
}
}
int main()
{
while(~scanf("%d%d%d",&suml,&n,&m))
{
for(int i=0;i<n;i++)
scanf("%d",&key[i]);
key[n]=suml,key[n+1]=2*suml;
sort(key,key+n);
printf("%d\n",fun(key[0],suml));
}
}