华为机试——输出最小跳跃次数

本文详细解析了一种算法,该算法旨在找出从一系列正整数的起始位置到达末尾所需的最少跳跃次数,每次跳跃的距离由所在位置的数值决定,且至少跳跃1格。文章通过实例演示了算法的具体实现过程。

题目描述

* 题目描述:给出一组正整数,你从第一个数向最后一个数方向跳跃,
*         每次至少跳跃1格,每个数字的值表示你这个位置可以跳跃的最大长度。
*         计算如何以最少的跳跃次数跳到最后一个数。
* 输入描述:
*         第一行表示有多少个数n 
*         第二行依次是1到n,一个数一行。
* 输出描述:
*         输出一行,表示跳跃最少的次数

代码实现

/******************************************************************
* 题目描述:给出一组正整数,你从第一个数向最后一个数方向跳跃,
* 		每次至少跳跃1格,每个数字的值表示你这个位置可以跳跃的最大长度。
* 		计算如何以最少的跳跃次数跳到最后一个数。
* 输入描述:
* 		第一行表示有多少个数n 
* 		第二行依次是1到n,一个数一行。
* 输出描述:
* 		输出一行,表示跳跃最少的次数
*****************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <limits.h>

#define NUM_BUF_SIZE		100		/* 最大可存储的数字数量 */

int main()
{
	int input[NUM_BUF_SIZE],res[NUM_BUF_SIZE];
	int num;
	int i=0,j=0;
	int temp = INT_MAX;
	
	scanf("%d",&num);
	
	memset(input,0,sizeof(input));
	memset(res,0,sizeof(res));
	
	while(i<num)
	{
		scanf("%d",&input[i]);
		i++;
	}
    
    for (i = 1; i < num; i++)
    {
        temp = INT_MAX;
        for (j = 0; j < i; j++)
        {
            if (input[j] + j >= i)			/* 找到可以跳出当前的点的值 */
            {
                temp = temp <= (res[j] + 1) ? temp : (res[j] + 1);
            }
        }
        res[i] = temp;
    }
	printf("%d\n",res[num-1]);
}

测试描述

输入:

7

2

3

2

1

2

1

5

输出:

3

注意事项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值