题意很简单就不要多说了,看到这个题目的第一个想法是用背包来做,不过想想数据是50万,基本已经没有戏了。
想想他跳跃的距离肯定是在maxx到L之间的,所以在这个区间进行二分,时间上就是n(logn)了。
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int q[500008];
int main(){
int l,n,m;
int i,left,mid,right;
while(~scanf("%d%d%d",&l,&n,&m)){
for(i=1;i<=n;i++){
scanf("%d",&q[i]);
}
q[0]=0;
q[n+1]=l;
sort(q,q+n+2);
int maxx=0;
for(i=0;i<=n;i++)
if(q[i+1]-q[i] > maxx) maxx=q[i+1]-q[i];
left=maxx; //左边必须从最大的间距开始
right=l;
while(left <= right){
mid=(left+right)/2;
int ant=0;
int ans=0;
for(i=1;i<=n;i++){
if(q[i]-q[ans] <= mid && q[i+1]-q[ans] > mid){ //可以跳到第i个位置,不可以跳到i+1个位置
ant++;
ans=i;
}
}
ant++; //跳到终点
if(ant <= m) right=mid-1;
else left=mid+1;
//printf("%d %d %d\n",ant,left,right);
}
printf("%d\n",left);
}
return 0;
}
坚持.......