码迷,mamicode.com
首页 > 其他好文 > 详细

The Frog's Games HDU - 4004

时间:2017-07-08 17:45:33      阅读:126      评论:0      收藏:0      [点我收藏+]

标签: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,&times))
    {
        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);
    }
}

  

The Frog's Games HDU - 4004

标签:scan   改变   return   距离   不能   ios   algorithm   int   can   

原文地址:http://www.cnblogs.com/masterchd/p/7137319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!