zoukankan      html  css  js  c++  java
  • 腾讯2019秋招--小q爬塔(dp)

    小Q爬塔

    题目描述:
     小Q 正在攀登一座宝塔,这些宝塔很特别。塔总共有 n 层,但是每两层之间的净高却不相同,所以造成了小Q 爬过每层的时间也不同。如果某一层的高度为 x,那么爬过这一层所需的时间也是 x。小Q 还会使用一种魔法,每用一次就可 以让他向上跳一层或两层,但是每次跳跃后小 Q 都将用完魔法力,必须爬过至少一层才能再次跳跃(你可以认为小 Q 需要跳两次一层才休息,最后也可以跳到塔外即超过塔高,挑是不消耗时间的)。 小 Q 享用最短的时间爬过塔顶,希望你能告诉他最短时间是多少?

    输入描述:
    第一行一个数 n(n≤10000)n(n≤10000),表示塔的层数。

    接下来的 n 行每行一个数 h(1≤h≤100)h(1≤h≤100),表示从下往上每层的高度

    输出描述:
    一个数,表示最短时间

    样例:
    输入:

    5

    3

    5

    1

    8

    4

    输出:

    1


    问题分析:
    * p[i]表示到达第i层最短时间,并且到达第i层方式是爬
    * t[i]表示到达第i层最短时间,并且到达第i层方式是跳
    * 情况一:到达第i层的方式是爬
    * 那么到达第i-1层的方式可以是跳,也可以是爬,二者选一,之后再加上由第i-1层爬到第i层的时间(也就是第i层的高度)
    * p[i] = min(p[i-1],t[i-1])+a[i];
    * 情况二:到达第i层的方式是跳
    * 那么可以从第i-1层起跳,也可以从i-2层起跳,并且到达i-1层和i-2层的方式只能是爬(因为不能连续跳两次),所以二者选最小的
    * t[i] = min(p[i-1],p[i-2])+0;
    *最后在t[n]和p[n]选择较小者做结果

    c++代码如下:
    #include<bits/stdc++.h>
    using namespace std;
    int p[10005],t[10005]; 
    int main(){
        int n,x;
        cin>>n;
        for(int i=1;i<=n;++i){
        cin>>x;
        p[i]=min(p[i-1],t[i-1])+x;    
        if(i==1) continue;
        t[i]=min(p[i-1],p[i-2])+0;//跳不需要花费时间    
        }
        cout<<min(p[n],t[n]); 
        return 0;
    }


    不一样的烟火
  • 相关阅读:
    接口测试工具 — jmeter(关联)
    接口测试工具 — jmeter(参数化)
    接口测试工具 — jmeter(header与cookie的添加)
    【多态】重写与重载的区别
    【面试】软件测试面试题
    【Jenkins】testng+testNgXslt+ant优化测试报告
    【ANT】输入中文格式为乱码
    【Sql】经典sql语句
    【log4j】使用注意事项
    【问题】用ant编译时,提示编码utf为不可映射字符
  • 原文地址:https://www.cnblogs.com/cstdio1/p/11302324.html
Copyright © 2011-2022 走看看