牛客周赛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);
    }
}
posted @ 2023-12-26 14:39  李菜菜想获奖  阅读(62)  评论(0)    收藏  举报