题目大意:青蛙要跳过长为L的河,中间有n个石头供他休息,但它只能跳m次,问这m次里所跳距离最大值的最小可能
想法:先把石头排序,算出相邻石头的距离b,然后就等价于,把b序列分成m段,对于每一段和的最大值最小化.
二分答案,显然答案在max(b[i])和l之间,我们只需要判断当答案是mid时,把序列分成了多少段逐渐二分
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 500005
int l,n,m,a[N],b[N],s,t;
int main()
{
while(~scanf("%d%d%d",&l,&n,&m))
{
s=0,t=l;
a[0]=0,a[n+1]=l;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a,a+n+2);
for(int i=0;i<=n;i++) b[i]=a[i+1]-a[i],s=max(s,b[i]);
while(s<t)
{
int cnt=0,sum=0,mid=(s+t)>>1;
for(int i=0;i<=n;i++)
{
sum+=b[i];
if(sum>mid)
{
cnt++;sum=b[i];
}
}
if(cnt<m) t=mid;
else s=mid+1;
}
printf("%d\n",s);
}
}