【算法】过桥

✨题目链接:

过桥


✨题目描述 

 

✨输入描述:

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

✨输出描述:

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

✨示例1

📍输入

4
2 2 -1 2 

📍输出

 2

📍说明

 1跳到2,1s 2跳到4,1s 共2s 

✨示例2

📍输入

 2
-1 -2

📍输出

 -1

✨解题思路

 贪心+bfs:

  • 初始化

    • leftright 初始化为1,表示从第一个浮块开始。
    • ret 初始化为0,记录当前传送的步数。
  • 循环条件

    • left 小于等于 right 时,进入循环。每一轮循环表示一次传送。
  • 步数递增

    • 每进入一次循环,步数 ret 加1。
  • 更新右边界

    • r 初始化为 right 的当前值。
    • 遍历当前传送范围 [left, right] 内的所有浮块,计算每个浮块能到达的最远位置 arr[i] + i
    • 更新 r 为最远的浮块位置。
  • 检查到达终点

    • 如果最远位置 r 大于等于 n,表示可以到达或超过 n 号浮块,返回当前步数 ret
  • 更新左右边界

    • 更新 leftright + 1,表示进入下一轮传送的起点。
    • 更新 right 为当前最远位置 r
  • 返回无法到达的情况

    • 如果循环结束后,仍未能到达 n 号浮块,返回 -1

✨代码
 

#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;
}


※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一岁就可帅-

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

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

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

打赏作者

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

抵扣说明:

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

余额充值