标签: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