计蒜客:跳跃游戏

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\n");
        else 
            printf("true\n");
    }
    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\n",ans);
	return 0;
} 

 

posted @ 2018-11-15 17:19  宿星  阅读(106)  评论(0编辑  收藏  举报