跳躍遊戲(貪心)
阿新 • • 發佈:2019-01-30
- 時間限制 1000ms
- 記憶體限制 65536K
題目描述
給定一個非負整數陣列,假定你的初始位置為陣列第一個下標。
陣列中的每個元素代表你在那個位置能夠跳躍的最大長度。
請確認你是否能夠跳躍到陣列的最後一個下標。
例如: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
解題思路
貪心思想:
方法一:從前往後找。我們可以找到第一個可以直接跳到最後一個地方的點,然後把這個地方作為最後一個點(這個點能到最後一個,那麼只要能到這個點就能到最後一個),一直迴圈,看看0這個地方能否作為最後一個點,如果能則輸出true,否則輸出false。
#include <stdio.h> int main() { int n, a[510]; while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) scanf("%d", &a[i]); n--; for (int i = 0; i < n; i++) { if (i + a[i] >= n) { n = i; i = -1; } } if (n) printf("false\n"); else printf("true\n"); } return 0; }
方法二:從後往前找。我們可以找到最後一個可以直接跳到最後一個地方的點,然後把這個地方作為最後一個點(這個點能到最後一個,那麼只要能到這個點就能到最後一個),一直迴圈,看看0這個地方能否作為最後一個點,如果能則輸出true,否則輸出false。
#include <stdio.h> int main() { int n, a[510]; while (~scanf("%d", &n)) { for (int i = 0; i < n; i++) scanf("%d", &a[i]); n--; for (int i = n - 1; i >= 0; i--) if (i + a[i] >= n) n = i; if (n) printf("false\n"); else printf("true\n"); } return 0; }
方法三:用MaxStep存當前跳躍的最大距離,迴圈遍歷出當前跳躍的最大距離。看看最後最大距離是否大於等於n,如果大於等於n則證明能到達最後一個,否則不能。
#include <cstring>
#include <iostream>
using namespace std;
int main() {
int n, a[510], maxstep;
while (cin >> n) {
for (int i = 0; i < n; i++)
cin >> a[i];
maxstep = a[0];
for (int i = 0; i < n; i++) {
if (i > maxstep) {//跳躍的最大距離小於i,證明到達不了i,則肯定到不了最後
printf("false\n");
break;
}
maxstep = max(maxstep, i + a[i]);
if (maxstep >= n - 1) {//跳躍的最大距離大於等於n,則肯定能到達最後
printf("true\n");
break;
}
}
}
return 0;
}