Tester解:F - Walnuts in Xmas Lease

投稿日: 更新日:

解説

MmM - mより最大値を大きくするのではなく、最小値をMMまで大きくするのが適切であることが分かります。

二分探索を使って最小値をxx以上にできるかを探索します。最小値をxx以上にするにはxx未満のAiA_iに対し、xAix - A_iだけ加える必要があります。この総和がWW以下であれば可能、そうでなければ不可能となります。

AmaxA_{max}AiA_iの最大値とすると、計算量はO(NlogAmax)O(N \log{A_{max}})です。

実装

use proconio::*;

fn main() {
    input! {
        n: usize,
        w: i64,
        a: [i64; n],
    }

    let f = |mi: i64| {
        let mut sum = 0;
        for i in 0..n {
            sum += (mi - a[i]).max(0);
        }
        sum <= w
    };

    let mut ok = 0;
    let mut ng = a.iter().max().unwrap() + 1;
    while ng - ok > 1 {
        let mid = (ok+ng)/2;
        if f(mid) {
            ok = mid;
        } else {
            ng = mid;
        }
    }

    println!("{}", a.iter().max().unwrap() - ok);
}

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人