题目描述
小青蛙住在一条河边,它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。
河里的石头排成了一条直线,小青蛙每次跳跃必须落在一块石头或者岸上。不过,每块石头有一个高度,每次小青蛙从一块石头起跳,这块石头的高度就会下降 1,当石头的高度下降到 0 时小青蛙不能再跳到这块石头上(某次跳跃后使石头高度下降到 0 是允许的)。
小青蛙一共需要去学校上 x 天课,所以它需要往返 2x 次。当小青蛙具有一个跳跃能力 y 时,它能跳不超过 y 的距离。
请问小青蛙的跳跃能力至少是多少才能用这些石头上完 x 次课。
输入格式
输入的第一行包含两个整数 n, x,分别表示河的宽度和小青蛙需要去学校的天数。请注意 2x 才是实际过河的次数。
第二行包含 n − 1 个非负整数 H1, H2, · · · , Hn-1,其中 Hi > 0 表示在河中与小青蛙的家相距 i 的地方有一块高度为 Hi 的石头,Hi = 0 表示这个位置没有石头。
输出格式
输出一行,包含一个整数,表示小青蛙需要的最低跳跃能力。
样例输入
复制
5 1 1 0 1 0
样例输出
复制
4
import java.util.*;
public class Main {
static int x, n;
static int[] arr, pes;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
x = sc.nextInt();
arr = new int[n + 1];
pes = new int[n + 1];//前缀和
for (int i = 1; i < n; i++) {
arr[i] = sc.nextInt();
pes[i] = pes[i - 1] + arr[i];
}
int l = 1, r = n;
int ans = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (is(mid)) {
ans = mid;
r = mid - 1;
} else {
l = mid + 1;
}
}
System.out.println(ans);
}
private static boolean is(int mid) {
for (int i = 1; i <= n - mid; i++) {
int m = i + mid - 1;
if (pes[m] - pes[i - 1] < 2 * x) return false;
}
return true;
}
}