
第一行一个数n(2≤n≤2000)
接下来一行n个数a[i](1≤|a[i]|≤2000)表示浮块上的数字
输出一行,表示对应的答案
4
2 2 -1 2
2
1跳到2,1s 2跳到4,1s 共2s
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
- 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
>arr[i]; - cout<<bfs()<
- return 0;
- }
※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持