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;
}