1. 程式人生 > >跳躍遊戲(貪心)

跳躍遊戲(貪心)

  • 時間限制 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;
}