跳石头深悉

#include<stdio.h>
#include<algorithm>
using namespace std;
int m,n;
long long l,map[50015],left,right,mid;
int main()
{
scanf("%lld %d %d",&l,&n,&m);
//if(n==0||m==0) {printf("%lld\n",l);return 0;}
for(int i=1;i<=n;i++)
    scanf("%lld",&map[i]);
map[n+1]=l;
left=0;
right=l;
while(left<=right)//可以等于,left=3,right=4时,mid=3,再进行一次后mid=4 
    mid=(left+right)/2;
    printf("mid=%lld\n",mid);
    int move=0,h=0;
    for(int i=1;i<=n+1;i++)
        {
         if(map[i]-h<mid)move++;
         else h=map[i];
        }
    if(move<=m) //如果发现石块刚好满足也要再往后找一找啊。。。万一下个也可以  
      { left=mid+1;printf("left1=%lld\n",left);}
       
    else {
        right=mid-1;
        printf("right1=%lld\n",right);
        }    
    printf("left=%lld\n",left);    
    printf("right=%lld\n",right);
}
printf("%lld",left-1); //为什么不输出left——因为看上面left=mid+1,而你二分的是mid---跳跃长度,显然left+1后并没有保证满足条件(下一个万一只更改了right就跳出呢?)
    return 0;
}

 

posted @ 2017-10-18 09:22  SH,Y  阅读(130)  评论(0编辑  收藏  举报