笔试真题笔记(持续更新)

笔试真题

  • 腾讯2019秋招笔试真题

小Q爬塔

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

小Q想用最短的时间爬到塔顶,希望你能告诉他最短时间是多少。

输入描述:

第一行一个数n(n<=10000),表示塔的层数。

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

输入样例:

5 3 5 1 8 4

输出样例:

1

解题思路:

p[ i ] 表示到达第i层的最短时间,并且到达第 i 层的方式是【爬】。

t[ i ] 表示到达第i层的最短时间,并且到达第 i 层的方式是【跳】。

到达第 i 层的方式采用爬还是跳:

情况1.到达第 i 层的方式是爬:
    那么到达第 i-1 层的方式可以是爬也可以是跳,从两者中选择最小。
    p[i] = min( p[i-1] , t[i-1] ) + a[i]
情况2.到达第 i 层的方式是跳:
    那么可以从第 i-1 层起跳。也可以从第i-2层起跳。并且到达第 i-1 层和 i-2 层的方式只能是选择爬,所以在两者中选最小。
    t[i] = min( p[i-1] , p[i-2] )

最后在 p[ n ] 和 t[ n ] 中选择 最小者做结果

代码

#include<stdio.h>
#define min(a,b) (((a)>(b)) ? (b):(a))

int p[10005],t[10005];

void main(){
    int i,n,x;
    scanf("%d",&n);

    for( i=1; i<=n; i++ ){
        scanf("%d",&x);
        p[i] = min(p[i-1],t[i-1])+x;
        if (i==1)continue;
        t[i] = min(p[i-1],p[i-2]);
    }
    printf("最少时间是%d\n",min(p[n],t[n]));
}

输出结果

5 3 5 1 8 4
a[1] = 3        p[1] = 3        t[1] = 0
a[2] = 5        p[2] = 5        t[2] = 0
a[3] = 1        p[3] = 1        t[3] = 3
a[4] = 8        p[4] = 9        t[4] = 1
a[5] = 4        p[5] = 5        t[5] = 1
最少时间是1
Press any key to continue


posted @ 2019-06-29 23:54  带了1个小才艺  阅读(127)  评论(0)    收藏  举报