腾讯2019秋招笔试题(Java实现)

1.小Q爬塔

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

输入描述:
第一行一个数n(n<=10000),表示从下往上每层的高度。
接下来的n行每行一个数h(1<=h<=100),表示从下往上每层的高度。
输出描述:
一个数,表示最短时间
输入样例:
5
3
5
1
8
4
输出样例:
1
————————————————

1.2图解描述

腾讯2019秋招笔试题(Java实现)_第1张图片

1.3思路分析

变量:
         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层的方式只能选爬(到第i层是跳),所以在俩者中选择最小
                     t[i]=min{p[i-1],p[i-2]}
 最后在p[n]和t[n]中选最小者做结果

1.4代码实现

import java.util.Scanner;
public class Tc1 {
	public static void main(String[] args) {
		//设置俩个时间数组,每一个元素存储的是经过之前层所需的最短时间
		int[] p=new int[10005];//p[i]表示到达当前第i层的最短时间,并且到达第i层的方式是爬
		int[] t=new int[10005];//t[i]表示到达当前第i层的最短时间,并且到达第i层的方式是跳
		int n,x;
		Scanner scanner=new Scanner(System.in);
		System.out.print("输入样例:");
		n=scanner.nextInt();	//输入层数
		for(int i=1;i<=n;i++) {	//遍历每一层,i既是层数又是角标
			x=scanner.nextInt();	//输入每一层的高度
			p[i]=Math.min(p[i-1], t[i-1])+x;	//到达第i层的方式是爬
			if(i==1) continue;	//至少跳一层才能跳跃
			t[i]=Math.min(p[i-1], p[i-2]);	//到达第i层的方式是跳跃
			
		}
		System.out.println("最短时间为:"+Math.min(p[n], t[n]));//俩种情况的最小值
	}
}

 

你可能感兴趣的:(编程题)