The Frog's Games HDU - 4004

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了The Frog's Games HDU - 4004相关的知识,希望对你有一定的参考价值。

#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的主要内容,如果未能解决你的问题,请参考以下文章

HDU 4004 The Frog's Games(二分+小思维+用到了lower_bound)

HDU 4004 The Frog's Games 二分

The Frog's Games

The Frog's Games(二分)

hdoj 4004 The Frog's Games(二分)

二分模板// The Frog's Games +Aggressive cows