利用贪心算法计算袋鼠过河问题

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/*
 * 一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远。
 * 每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃。
 * 河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸。如果无法到达输出-1
 */
public class KangarooRiver2 {
	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.valueOf(br.readLine());
		String readString = br.readLine();
		String[] split = readString.split(" ");
		int[] t = new int[split.length];
		for (int i = 0; i < t.length; i++) {

			t[i] = Integer.valueOf(split[i]);
		}

		int step = 0;
		int dist = 0;
		int now = 0;
		while (now < n) {
			int temp = -1;
			for (int i = dist + 1; i <= t[dist] + dist; i++) {

				if (temp < (i + t[i]) && (i + t[i]) < n) {
					temp = i + t[i];
					now = i;
				} else if (i + t[i] >= n) {
					now = n + 1;
					step++;
					System.out.println(step + 1);
					System.exit(0);
				}

			}

			if (temp != -1 && t[temp] == 0 && temp < n) {
				boolean flag = true;
				int i = 1;
				while (flag && i < t[now] + 1) {
					if (t[now + i] + i < t[now]) {
						i++;
					} else {
						flag = false;
					}
				}
				if (flag) {
					step = -1;
					System.out.println(step);
					System.exit(0);
				}
			}

			dist = now;
			step++;

		}

		// System.out.println(step);
	}
}


你可能感兴趣的:(利用贪心算法计算袋鼠过河问题)