每日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());
}
}