牛客周赛Round24 D 小红的数组操作
https://ac.nowcoder.com/acm/contest/71993/D
import java.util.*;
import java.util.function.Function;
class Main {
/**
* 思路 : 非常典型的二分验证题目, 记住这种提醒就好了, 其实数据范围给的还挺明显的
* 题目具有二段性, 前半段的答案不可行, 后半段的答案可行, 二分中间的边界即可, 也就是最小的可行答案
* 根据分析, 应该是二分右边界
* */
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(), k = sc.nextInt(), x = sc.nextInt();
long[] arr = new long[n + 10]; // 注意数据范围给的是谁, n才是arr的大小
for (int i = 1; i <= n; i ++ ) arr[i] = sc.nextLong();
Function<Long, Boolean> check = (e) -> { // 新语法, 通过lambda表达式直接实现函数式接口, 然后调用
long now = 0;
for (int i = 1; i <= n; i ++ ) {
if (arr[i] > e) now += (arr[i] - e + x - 1) / x;
if (now > k) return false; // 该方案不行
}
return true; // 该方案可行
};
long l = Long.MIN_VALUE, r = Long.MAX_VALUE;
while (l < r) {
long mid = l + r >> 1;
if (check.apply(mid)) r = mid;
else l = mid + 1;
}
System.out.println(l);
}
}

浙公网安备 33010602011771号