输入分两行,第一行是数组长度N (1 ≤ N ≤ 10000),第二行是每一项的值,用空格分隔。
输出最少的跳数,无法到达输出-1
5 2 0 1 1 1
4
逻辑清晰 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; /** * @author: noob * @description : * @Date : 22:41 2024/10/29 */ // https://www.nowcoder.com/practice/74acf832651e45bd9e059c59bc6e1cbf?tpId=182&tqId=34693&ru=/exam/oj public class 袋鼠过河 { // 一开始使用的bfs 发现超时过不了; // 然后用贪心 每一步都使用利益最大化 public static void main(String[] args) throws IOException { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = scanner.nextInt(); } int count = 0; for (int curIndex = 0; curIndex < n; ) { // 如果为0 则跳不出去失败 if (arr[curIndex] == 0) { count = -1; break; } // 如果本次最大跳跃 直接跳出去了成功,并且跳跃=1 if (curIndex + arr[curIndex] > n - 1) { count++; break; } // 下面寻找 本次跳跃后 可以达到最大的位置 int whichIndex = 0; int maxlength = 0; int can = arr[curIndex]; for (int i = can; i > 0; i--) { if (curIndex + i + arr[curIndex + i] > maxlength) { whichIndex = curIndex + i; maxlength = curIndex + i + arr[curIndex + i]; } } // 选择完成 跳下一步 count++; // 更新当前位置 curIndex = whichIndex; } System.out.println(count); } } }
import java.util.Scanner;
public class Main {
static int max = Integer.MIN_VALUE;
public static void main(String[] args) {
// 使用动态的规划进行查看
Scanner sc = new Scanner(System.in);
int n =sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
System.out.println(dp(arr));
}
private static int dp(int[] arr) {
// 创建一个dp数组用来记录每一个位置的最小步数
int[] dp = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
dp[i] = Integer.MAX_VALUE;
}
dp[0] = 0;
int n = arr.length;
// 设计每每一个位置跳到的最小步数
for (int i = 0; i < arr.length; i++) {
// 如果出现 3 0 0 0 0 5 0 0 0 0 的情况就要排除,所以当前的dp[i]必须不等于最大值
if(dp[i] != Integer.MAX_VALUE)for (int j = 0; j <= arr[i]; j++) {
if (i + j <= arr.length - 1) {
dp[i + j] = Math.min(dp[i + j], dp[i] + 1);
} if (i + j > arr.length - 1) { // 如果当前的 加上可以向前跳的距离大于 河的长度直接返回 dp[i] + 1
return dp[i] + 1;
}
}
} // 最后进行判断,只要最后一个位置是的不等于int最大值并且arr[arr.length - 1] > 0 就返回dp[n - 1] + 1
if (dp[n - 1] > 0 && arr[n - 1] != 0) {
return dp[n - 1] + 1;
} else {
return -1;
}
} }
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int arrLen = sc.nextInt();
int[] arr = new int[arrLen];
int[] dp = new int[arrLen];
int minNum = Integer.MAX_VALUE;
dp[0]=0;
for(int i=1; i<dp.length; i++){
dp[i] = Integer.MAX_VALUE;
for(int i=0; i<arrLen; i++){
arr[i] = sc.nextInt();
}
if(arr[0]==0){
System.out.println(-1);
return;
}
if(arr[i]!=0){
for(int j=i+1; j<=Math.min(arr.length-1 , i+arr[i]); j++){
dp[j] = Math.min(dp[i]+1, dp[j]);
}
if(i+arr[i]>=dp.length){
minNum = Math.min(minNum, dp[i]+1);
}
}
}
if(dp[i]==Integer.MAX_VALUE){
System.out.println(-1);
return;
}
System.out.println(minNum);
}
}
/**
* 贪心
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
int n=sc.nextInt();
int[] a=new int[n];
for (int i = 0; i < a.length; i++)
a[i]=i+sc.nextInt(); //i位置最远能到达的位置
int step=1;
int cur_max_i=a[0];//当前能到达的最远位置
int max_i=a[0];//遍历过程中能到达的最远位置
for (int i = 1; i < a.length; i++) {
if (cur_max_i<i) {
step++;
//遍历过程中不能跳到比当前更远的位置了
if (cur_max_i==max_i) {
System.out.println(-1);
break;
}
cur_max_i=max_i;
}
if (max_i<a[i]) {
max_i=a[i];
}
//当前遍历过程中已经有能到达河对岸的位置了
if (max_i>=a.length) {
System.out.println(step+1);
break;
}
}
sc.close();
}
}
import java.util.*;
public class Main {
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
while (in.hasNext())
{
int n=in.nextInt();
int[] zhuangzi=new int[n];
for(int i=0;i<n;++i)
zhuangzi[i]=in.nextInt();
System.out.println(DynamicProgram(zhuangzi));
}
}
public static int DynamicProgram(int[] dx)
{
int i,j,len=dx.length;
int[] dp=new int[len+1];
for(i=0;i<=len;++i)
dp[i]=Integer.MAX_VALUE;
dp[0]=0;
if(dx[0]==0) return -1;
for(i=0;i<len;++i) {
if(dx[i]!=0)
for (j = 1; j <= dx[i]; ++j)
{
if((i+j)<len&&dx[i+j]!=0&&dp[i]!=Integer.MAX_VALUE)
dp[i+j] = Math.min(dp[i+j],dp[i]+1);
else if(i+j>=len&&dp[i]!=Integer.MAX_VALUE)
dp[len]=Math.min(dp[len],dp[i]+1);
}
}
if(dp[len]==Integer.MAX_VALUE)
return -1;
else
return dp[len];
}
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < arr.length; i ++) {
arr[i] = sc.nextInt();
}
int[] dp = new int[n + 1];
for (int i = 0; i < n; i ++) {
int endPosition = Math.min(i + arr[i], n);
for (int j = i + 1; j <= endPosition; j ++) {
if(dp[j] == 0) dp[j] = dp[i] + 1;
}
if(dp[n] != 0 || (arr[i] == 0 && dp[i] == 0)) break;
}
if(dp[n] != 0) System.out.println(dp[n]);
else System.out.println( - 1);
}
}
}
arrB[i + j] = Math.min(arrB[i + j], arrB[i] + 1)
import java.util.Scanner; public class Main{ public static void main(String args[]){ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int arrA[] = new int[n]; int arrB[] = new int[n]; for(int i = 0; i < n; i ++){ arrA[i] = scanner.nextInt(); arrB[i] = Integer.MAX_VALUE; } arrB[0] = 0; int result = Integer.MAX_VALUE; for(int i = 0; i < n; i++){ if(arrB[i] == Integer.MAX_VALUE) continue; for(int j = 1; j <= arrA[i]; j++){ if(i + j >= n){ result = Math.min(arrB[i] + 1, result); break; } arrB[i + j] = Math.min(arrB[i + j], arrB[i] + 1); } } if(result == Integer.MAX_VALUE) result = -1; System.out.println(result); } }
还是可以On的
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
int[] arr;
while(sc.hasNext()) {
n = sc.nextInt();
arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int step = 0;
int cur = 0;
int next = 0;
for(int i = 0; i < n; i++) {
if(i > cur) {
if(next == 0) {
break;
}
cur = next;
next = 0;
step++;
}
next = Math.max(next, arr[i] == 0 ? 0 : arr[i] + i);
if(next >= n) {
break;
}
}
if(next == 0)
System.out.println(-1);
else
System.out.println(step + 1);
}
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int[] num = new int[N + 1];
for (int i = 0; i < N; i++) num[i] = sc.nextInt();
num[N] = 1;//这是在陆地上了,不为0就可以了
int[] dp = new int[N + 1];
for (int i = 0; i <= N; i++) dp[i] = 10000;
dp[0] = 0;
for (int j = 1; j <= N; j++){
if (num[j] == 0) continue;
for (int i = 0; i < j; i++){
if (num[i] >= j - i) dp[j] = Math.min(dp[i] + 1, dp[j]);
}
}
System.out.println((dp[N] == 10000) ? -1 : dp[N]);//跳到陆地上最少需要的step
}
}