✨题目链接:
过桥
✨题目描述
✨输入描述:
第一行一个数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:
-
初始化:
left
和right
初始化为1,表示从第一个浮块开始。ret
初始化为0,记录当前传送的步数。
-
循环条件:
- 当
left
小于等于right
时,进入循环。每一轮循环表示一次传送。
- 当
-
步数递增:
- 每进入一次循环,步数
ret
加1。
- 每进入一次循环,步数
-
更新右边界:
r
初始化为right
的当前值。- 遍历当前传送范围
[left, right]
内的所有浮块,计算每个浮块能到达的最远位置arr[i] + i
。 - 更新
r
为最远的浮块位置。
-
检查到达终点:
- 如果最远位置
r
大于等于n
,表示可以到达或超过n
号浮块,返回当前步数ret
。
- 如果最远位置
-
更新左右边界:
- 更新
left
为right + 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;
}
※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持