每日OJ_牛客_过桥_贪心+BFS_C++_Java

目录

牛客_过桥_贪心+BFS

题目解析

C++代码

Java代码


牛客_过桥_贪心+BFS

过桥

描述:
        dd被困在了一个迷幻森林,现在她面前有一条凶险的大河,河中央有n个神奇的浮块,浮块按1∼n1顺序标号,但两两并不相接,第i个浮块上有一个数字a[i],可能是正数,也可能是负数,每块浮块都附带一个魔法结界用于传送,当a[i]a[i]a[i]为正数时,dd可以选择传送到第i+k(1≤k≤a[i])个浮块上,当dd抵达n号浮块时才可以顺利脱身,显然不管a[n]是多少,都没有任何意义,当a[i]为负时,dd只能选择标号小于等于i+a[i]的任意一块浮块进行传送,当i+a[i]<1时,默认只能传送到1的位置,每次传送都会花费1s的时间,随着时间的流逝,迷雾森林的空气会被逐渐榨干,她现在在1号浮块,她想知道,她最快多久能顺利脱身,如果始终无法逃脱,请输出−1

输入描述:

第一行一个数n(2≤n≤2000)

接下来一行n个数a[i](1≤|a[i]|≤2000)表示浮块上的数字

输出描述:

输出一行,表示对应的答案


题目解析

类似层序遍历的思想:


C++代码

#include <iostream>
using namespace std;
const int N = 2010;
int n;
int arr[N];

int bfs()
{
    int left = 1, right = 1;
    int ret = 0;
    while(left <= right)
    {
        ++ret;
        int r = right;
        for(int i = left; i <= right; ++i)
        {
            r = max(r, arr[i] + i);
            if(r >= n)
                return ret;
        }
        left = right + 1;
        right = r;
    }
    return -1;
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; ++i)
    {
        cin >> arr[i];
    }
    cout << bfs() << endl;
    return 0;
}

Java代码

import java.util.*;
public class Main
{
    public static int n;
    public static int[] arr = new int[2010];

    public static int bfs()
    {
        int left = 1, right = 1;
        int ret = 0;
        while(left <= right)
        {
            ret++;
            int r = right;
            for(int i = left; i <= right; i++)
            {
                r = Math.max(r, arr[i] + i);
                if(r >= n)
                {
                    return ret;
                }
            }
            left = right + 1;
            right = r;
        }
        return -1;
    }

    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        for(int i = 1; i <= n; i++)
        {
            arr[i] = in.nextInt();
        }

        System.out.println(bfs());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GR鲸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值