貪心算法-跳躍問題

給定一個非負整數數組,假定你的初始位置爲數組第一個下標。

數組中的每個元素代表你在那個位置能夠跳躍的最大長度。

請確認你是否能夠跳躍到數組的最後一個下標。

例如: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(1n500),接下來的一行 nn 個整數,輸入數組 A_iAi

輸出格式

如果能跳到最後一個下標,輸出true,否則輸出false

樣例輸入

5

2 0 2 0 1

樣例輸出

true

分析:需要注意的一點是:只要跳躍到值爲0的位置時,跳躍就會停止,如果此時不能到達最後的數組下標,那就不能跳躍到最後的數組下標位置了。

#include <iostream>
using namespace std;
/*

*/
int main()
{
    int n,a[501],f;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    if(n==1)
        cout<<"true"<<endl;
    else if(a[0]==0)
        cout<<"false"<<endl;
    else
    {
        n--;        //最後一個元素不需要檢驗
        for(int i=1;i<n;i++)
        {
            if(a[i]==0)       //檢驗a[1]~a[n-2]中所有等於0的元素
            {
                f=0;
                for(int k=i-1;k>=0;k--)  //對每個在等於0的a[i]進行檢驗,判斷是否能夠跳過
                {
                    if(k+a[k]>i)         //如果位置i前有能夠跳過a[i]的存在
                    {
                        f=1;
                        break;
                    }
                }
                if(f==0)              //如果如果位置i前沒有能夠跳過a[i]的存在,不符合題意直接結束程序
                {
                    cout<<"false"<<endl;
                    return 0;
                }
            }
        }
        cout<<"true"<<endl;
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章