zoukankan      html  css  js  c++  java
  • P1929 迷之阶梯

    题目描述

    在经过地球防卫小队的数学家连续多日的工作后,外星人发的密码终于得以破解。它 告诉我们在地球某一处的古老遗迹中,存在有对抗这次灾难的秘密武器。防卫小队立即赶 到这处遗迹。要进入遗迹,需要通过一段迷之阶梯。登上阶梯必须要按照它要求的方法, 否则就无法登上阶梯。它要求的方法有以下三个限制:

    1. 如果下一步阶梯的高度只比当前阶梯高 1,则可以直接登上。

    2. 除了第一步阶梯外,都可以从当前阶梯退到前一步阶梯。

    3. 当你连续退下 k 后,你可以一次跳上不超过当前阶梯高度 2^{k}2k 的阶梯。比如说你现 在位于第 j 步阶梯,并且是从第 j+k 步阶梯退下来的,那么你可以跳到高度不超过当前阶 梯高度+2^{k}2k 的任何一步阶梯。跳跃这一次只算一次移动。

    开始时我们在第一步阶梯,由于时间紧迫,我们需要用最少的移动次数登上迷之阶梯。 请你计算出最少的移动步数。

    输入输出格式

    输入格式:

    第一行:一个整数 N,表示阶梯步数。

    第二行:N 个整数,依次为每层阶梯的高度,保证递增。

    输出格式:

    第一行:一个整数,如果能登上阶梯,输出最小步数,否则输出-1。

    输入输出样例

    输入样例#1: 复制
    5
    0  1  2  3  6 
    
    输出样例#1: 复制
    7

    说明

    【样例解释】

    连续登 3 步,再后退 3 步,然后直接跳上去。

    【数据范围】

    对于 50%的数据:1≤N≤20。

    对于 100%的数据:1≤N≤200。

    对于 100%的数据:每步阶梯高度不超过 2^31-1

    /*让dp[i]为跳到i的最小步数。 
    1、sta[i]==sta[i-1]+1 --> dp[i]=dp[i-1]+1
    2、dp[i]=min(dp[i],dp[j + k]+k+1) 其中k=log2(sta[i]-sta[j]),表示从i到j要退几步。*/
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    
    int n,ans=999999999;
    int sta[205],dp[205];
    
    inline int read(int &num)
    {
        num=0;
        char c=getchar();
        for(;!isdigit(c);c=getchar());
        for(;isdigit(c);c=getchar()){num=num*10+c-'0';}
    }
    
    int main()
    {
        memset(dp,0x3f,sizeof(dp));
        read(n);
        for(int i=1;i<=n;i++)
        {
            read(sta[i]);
        }
        dp[1]=0;    //跳第一个台阶需要0步 
        for(int i=2;i<=n;i++)
        {
            if(sta[i]==sta[i-1]+1) dp[i]=dp[i-1]+1;
            for(int j=1;j<i;j++)
            {
                int k=ceil(log2(sta[i]-sta[j]));    //计算从i要退几步才到点j,即计算2^k中的k的值    
                if(j+k<=i)
                {
                    dp[i]=min(dp[i],dp[j+k]+k+1);    //从j+k退到j需要k步,再跳到i还需要1步 
                }
            }
        }
        if(dp[n]<0x3f3f3f3f) printf("%d",dp[n]);    //能跳到 
        else printf("-1");    //跳不到 
        return 0;
    }
  • 相关阅读:
    20165322 第九周 实现mypwd
    20165322 第七周 mybash 的实现
    2018-2019-1 20165322 实验三 实时系统
    2018-2019-1 20165318 20165322 20165326 实验二 固件程序设计
    2018-2019-1 20165322 《信息安全系统设计基础》第六周学习总结
    codeblocks汉化
    2019-2020-1 20175334 实验五 《通讯协议设计》实验报告
    2019-2020-1 20175334 20175322 20175315 实验四 外设驱动程序设计
    2019-2020-1 20175315 20175322 20175334 实验三 实时系统
    2019-2020-1 20175334 20175322 20175315 实验二 固件程序设计
  • 原文地址:https://www.cnblogs.com/lovewhy/p/8717632.html
Copyright © 2011-2022 走看看