计蒜客:跳跃游戏

https://nanti.jisuanke.com/t/18

给定一个非负整数数组,假定你的初始位置为数组第一个下标。

数组中的每个元素代表你在那个位置能够跳跃的最大长度。

请确认你是否能够跳跃到数组的最后一个下标。

例如:A=[2,3,1,1,4]A = [2,3,1,1,4]A=[2,3,1,1,4] 能够跳跃到最后一个下标,输出true

A=[3,2,1,0,4]A = [3,2,1,0,4]A=[3,2,1,0,4] 不能跳跃到最后一个下标,输出false

输入格式

第一行输入一个正整数 n(1≤n≤500)n(1 leq n leq 500)n(1≤n≤500),接下来的一行 nnn 个整数,输入数组 AiA_iAi​。

输出格式

如果能跳到最后一个下标,输出true,否则输出false

样例输入

5
2 0 2 0 1

样例输出

true

贪心问题,因为只要跳到最后一格即可,所以只要从最后一格开始。

从第一格跳到最后一格和从最后一格跳到第一格是相同的。

如果从一个格子可以跳到最早出现的可以直接跳到最后一格的后面,

那就可以先直接跳到这个格子,再到终点,

如果不能达到,这个格子已经是最近的了,肯定不能跳到最后。

找一个最早出现的可以直接跳到最后一格的,

把这一格变成最后一格,

重复是上面的过程,如果最后一格变为0,就为true,否则为false。

#include<stdio.h>
#define N 1020
int a[N];
int main()
{
    int n,i;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
        n--; 
        for(i=0;i<n;i++)
        {
            if(a[i]>=n-i)
            {
                n=i;
                i=-1;
            }
        }
        if(n!=0)
            printf("false
");
        else 
            printf("true
");
    }
    return 0;
}

跳跃游戏二

给定一个非负整数数组,假定你的初始位置为数组第一个下标。

数组中的每个元素代表你在那个位置能够跳跃的最大长度。

你的目标是到达最后一个下标,并且使用最少的跳跃次数。

例如:

A=[2,3,1,1,4]A = [2,3,1,1,4]A=[2,3,1,1,4],到达最后一个下标的最少跳跃次数为 222。(先跳跃 111 步,从下标 000 到 111,然后跳跃 333 步,到达最后一个下标。一共两次)

输入格式

第一行输入一个正整数 n(1≤n≤100)n(1 le n le 100)n(1≤n≤100) ,接下来的一行,输入 nnn 个整数,表示数组 AAA。

输出格式

最后输出最少的跳跃次数。

样例输入

5
3 1 1 1 1

样例输出

2
#include<stdio.h>
#define N 120
int a[N];
int main()
{
	int n,i,ans;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	ans=0;
	n--;
	for(i=0;i<n;i++)
	{
		if(a[i]>=n-i)
		{
			n=i;
			i=-1;
			ans++;
		}
	}
	printf("%d
",ans);
	return 0;
} 
原文地址:https://www.cnblogs.com/zyq1758043090/p/10002937.html