问题标题: 酷町堂:2782 跳一跳

0
0
已解决
汪恺恒
汪恺恒
中级启示者
中级启示者

题目描述 Description

有n个盒子排成一行,每个盒子上面有一个数字a[i],表示最多能向右跳a[i]个盒子;
小明站在左边第一个盒子,请问能否到达最右边的盒子?
比如说:[1, 2, 3, 0, 4] 可以到达第5个盒子;
[3, 2, 1, 0, 4] 无法到达第5个盒子。

输入描述 Input Description

多组测试数据
第一行,一个整数,n,表示n组测试数据
接下来n组
每组第一行一个整数,m,表示有m个盒子
接下来一行m个整数,x1 x2 … xi … xm,xi表示可以从第i个盒子上跳xi个盒子

输出描述 Output Description

对于每组测试数据,如果能跳到最后一个盒子,则输出1,否则输出0

 

本蒟蒻不知道用贪心怎么写,于是写了个dfs

可想而知,TLE60

#include<iostream>
#pragma GCC optimize(3)
using namespace std;
int n,t,a[105],flag;
void dfs(int pos){
    if(flag) return ;
    if(pos==n){
        flag=1;
        return ;
    }
    if(a[pos]==0) return ;
    for(int i=1;i<=a[pos];i++){
        if(pos+i<=n){
            dfs(pos+i);
        }
    }
}
int main(){
    cin>>t;
    while(t--){
        flag=0;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        dfs(1);
        cout<<flag<<endl;
    }
    return 0;
}

求正解思路


0
已采纳
张帆
张帆
中级天翼
中级天翼

贪心思路:

O(n^2)

定义mark数组,注意要全体置位false

循环遍历每个盒子,然后j从i+1 to i+a[i]

对于每个j,mark[j]=mark[i]

最后直接输出mark[m]即可。

0
我要回答