#include <iostream>

using namespace std;

int main() 
{
    int n;
    cin>>n;
  //jingen
    int a[200010];
    int ma=0;
    for(int i=1;i<=n;i++) cin>>a[i];
    if(a[1]==0&&n!=1)
    {
        cout<<"false";
        return 0;
    }
    if(n==1)
    {
        cout<<"true";
        return 0;
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i]!=0)
        {
            ma=max(ma,a[i]+i);
            if(ma>=n)
            {
                cout<<"true";
                return 0;
            }
        }
        else 
        {
            int j=i;
            i=min(n,ma);
            while(a[j]==0)
            {
                j++;
            }
            if(j<i)
            {
                for(int k=j;k<=i;k++)
                {
                    ma=max(a[k]+k,ma);
                    if(ma>=n)
                    {
                        cout<<"true";
                        return 0;
                    }
                }
            }
            if(a[i]==0)
            {
                cout<<"false";
                return 0;
            }
            else ma=max(ma,a[i]+i);
        }
    }
    cout<<"true";
    return 0;
}

由题目观察,当n=1时,起点即为终点。其他情况用ma判断当前能到达的最远距离,当a[i]=0时,判断是否能更新到非零位置,并判断其间是否存在非零位置,返回继续更新ma,当ma>=n,则到达终点。参与链接