给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:A=[2,3,1,1,4] 能够跳跃到最后一个下标,输出true;
A=[3,2,1,0,4] 不能跳跃到最后一个下标,输出false。
输入格式
第一行输入一个正整数n(1≤n≤500),接下来的一行 n 个整数,输入数组 Ai 。
输出格式
如果能跳到最后一个下标,输出true,否则输出false。
样例输入 复制
5
2 0 2 0 1
样例输出 复制
true
mx代表能到的最大的下标
因为从一个点出发假设为下标为i,能到达的最大长度是a[i],能到的最大下标是i+a[i]
因为从i开始到i+a[i]都是连续的,也就是说下标[i, i+a[i]]都能到达,因为我可以走的步长可以是1~a[i]
所以有下标为 i+1, i+2, i+3, … i+a[i]这些点都可以到达
这里的第一步不是本身而是i+1
#include <stdio.h>
#include <cstring>
long long max(long long x, long long y) {
return x > y ? x : y;
}
int main() {
long long a[510], n, i;
scanf("%lld", &n);
for (i = 0; i < n; i++) scanf("%lld", &a[i]);
long long mx = a[0]; // 所能达到的最大下标
for (i = 0; i <= mx; i++) {
mx = max(mx, i+a[i]);
if (mx >= n-1) break;
}
if (mx >= n-1) printf("true\n");
else printf("false\n");
return 0;
}