标签:scan 改变 return 距离 不能 ios algorithm int can
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <string> const int maxn = 500010; using namespace std; int stones[maxn]; int l,num,times;//三个变量的意思分别是,河流长,石子个数,最大次数 bool check(int n) { if(n*times<l)//如果尝试长度*最大次数小于河的长度 一定不行 return false; int i=0,steps=1;//最少需要一步,从头直接跳到尾,一步过 for(int k=1;k<=num+1;k++)//从开始石头位置遍历尝试 { if(stones[k]-stones[i]>n)//从起点尝试 { if(k==i+1)//如果两个相邻石头的距离大于尝试距离,跳不过去; return false; else { i=k-1;//若果1,3石头距离 是 2 , n 是 1 //就去尝试 2,3的距离是不是满足,这时候就让i=2. k-=1;//满足,再次尝试扩大距离; //循环中有个k++,为了不改变K,让k--; steps++;//步++,尝试用多一步走完这点路,steps++; } } } if((steps)>times)//如果步数大于最大跳的次数 , 行不通 return false; return false; return true;//满足所有规律,正确 } int main() { while(~scanf("%d%d%d",&l,&num,×)) { stones[0]=0; for(int i=1;i<=num;i++) scanf("%d",&stones[i]); stones[num+1]=l; sort(stones,stones+num+1);//来一发升序排序 int ileft=0,iright=l; while(ileft<=iright)//二分法 { int mid=(ileft+iright)/2; if(check(mid)) iright=mid-1;//满足,就给他尝试再次缩小距离,看看还能不能以times次数过去 else ileft=mid+1;//反之,超出times,扩大一下跳远能力 } printf("%d\n",ileft);//printf("%d\n",iright); } }
标签:scan 改变 return 距离 不能 ios algorithm int can
原文地址:http://www.cnblogs.com/masterchd/p/7137319.html