标签:选择 整数 for 游戏 ann ring 算法 贪心 tin
给定一个非负整数数组,假定你的初始位置为数组第一个下标。
数组中的每个元素代表你在那个位置能够跳跃的最大长度。
请确认你是否能够跳跃到数组的最后一个下标。
例如:
A=[2,3,1,1,4] 能够跳跃到最后一个下标,输出true
;
A=[3,2,1,0,4] 不能跳跃到最后一个下标,输出false
。
第一行输入一个正整数 n (1 ≤ n ≤ 500),接下来的一行 n 个整数,输入数组 A[n]。
如果能跳到最后一个下标,输出true
,否则输出false
。
package javaexam;
import java.util.Scanner;
public class IsJumpToEnd
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int farthest = 0;
int[] A = new int[n];
for(int i = 0; i < n; ++i)
{
A[i] = input.nextInt();
if(farthest < i)
{
System.out.print(false);
break;
}
farthest = Math.max(farthest, A[i] + i);
if(farthest >= n - 1)
{
System.out.print(true);
break;
}
}
}
}
import java.util.*;
public class Main {
public static void main(String args[])
{
Scanner input = new Scanner(System.in);
int n = input.nextInt();
/*
思路:贪心算法;
从第一个开始,寻找一个可以跳最远的点;
例如:a[7]={3,1,2,4,1,0,0}
0 1 2 3 4 5 6
1.从第一个位置0,可以跳到位置1、2、3;
2.如果跳到位置1,那么最远可跳到(1+a[1]);
3.如果跳到位置2,那么最远可跳到(2+a[2]);
4.如果跳到位置3,那么最远可跳到(3+a[3]);
5.故选择跳到位置3,重复上述步骤;
算法分析:
1.如果选择跳到位置3,就无法选择跳到位置1和位置2,那么会不会错过最优解呢?不会!
2.因为位置1、2能到达的位置,位置3都可达;
3.故不会错过最优解。
*/
int[] a = new int[n];
for(int i = 0; i < n; ++i)
{
a[i] = input.nextInt();
}
int i;
int r; //控制搜索终止位置
int l; //控制搜索开始位置
for(i = 0; i < n && a[i] != 0;) //当a[i]=0时,该位置为可到达的最远位置
{
r = i + a[i];
l = i + 1;
for(int j = i + 1; j < n && j <= i+a[i]; ++j)
{
if(j+a[j] >= r) //遍历能到达的最远位置
{
r = j + a[j]; //更新左右边界
l = j;
}
}
i = l; //左边界
}
if(i < n - 1)
{
System.out.println("false");
}
else
{
System.out.println("true");
}
}
}
样例一:
5
2 3 1 1 4
true
样例二:
5
3 2 1 0 4
false
标签:选择 整数 for 游戏 ann ring 算法 贪心 tin
原文地址:https://www.cnblogs.com/narisu/p/9057873.html