输入分两行,第一行是数组长度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 } }