给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如: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] 不能跳跃到最后一个下标,输出false。
输入格式
第一行输入一个正整数 n(1 \leq n \leq 500)n(1≤n≤500),接下来的一行 nn 个整数,输入数组 A_iA
i
。
输出格式
如果能跳到最后一个下标,输出true,否则输出false。
样例输入
5
2 0 2 0 1
样例输出
true
#include<iostream>
#include<cstring>
int N;
int step[501];
int flag[501];
int main()
{
scanf("%d",&N);
for(int i = 0 ;i<N; i++)
{
scanf("%d",&step[i]);
}
int move = step[0];
int i = 0;
while(flag[i]==0 || i<N-1)
{
if(step[i] == 0)//不加这句话 运行超时
break;
flag[i] = 1;
move = step[i];
i +=move;
}
if(i>=N-1)
printf("true");
else
printf("false");
return 0;
}
贪心算法,时间复杂度低,可取。主要思想就是从第一个数组元素开始计算此数组元素所能到达的最远的数据元素下标,如果后面有更远的则替换max值,但如果出现下标值比能达到的最远元素max的值还大的数组元素,说明此元素不可达到,那么最后一个元素更不可达到,就返回“false”,否则返回“true”。
#include<iostream>
#include<cstring>
int N;
int step[501];
int flag[501];
int main()
{
int max =0;
scanf("%d",&N);
for(int i = 0 ;i<N; i++)
{
scanf("%d",&step[i]);
}
for(int i = 0; i<N; i++)
{
if(i>max)
{
printf("false");
return 0;
}
if(i+step[i]>max)
max = i + step[i];
}
printf("true");
return 0;
}