POJ 3104: Drying

概要

洗濯物がn個あって,自然乾燥だと1分間に洗濯物の水が1だけ減る.暖房機を使えば,1分間にkだけの水を減らすことができるが,これは1分間に1つの洗濯物についてだけしか使えない.
暖房機を最適に使った時,すべての洗濯物を乾かすのに必要な最小の時間はいくつか.

解法


洗濯物を乾かすために必要な時間を仮定して二分探索.

「暖房機を使えば1分間にkだけ水を減らすことができる=自然乾燥に比べて1分間あたりk-1多く水を減らすことができる」に注意して,二分探索の判定を行う.
洗濯物iの水分量をa_iとする.時間tだけかけて洗濯物の乾燥が終わるかどうかの判定は,水分量がtより多い洗濯物iに対しceil(a_i-t/(k-1))を求め,その総和がt以下であるかどうかで行うことができる.
計算式を見ればわかるが,k=1のコーナーケースには気を付けること.

解法の勘違いとコーナーケースの見落としでWA出した.

int n, k;
ll a[100010];
bool C(ll t){
    ll sum = 0;
    for(int i = 0; i < n; ++i){
        if(a[i] > t){
            sum += (a[i] - t + k - 1) / k;
        }
    }
    return sum <= t;
}
int main(){
    scanf("%d", &n);
    for(int i = 0; i < n; ++i) scanf("%lld", &a[i]);
    scanf("%d", &k);

    --k;
    ll l = 0, u = 0;
    for(int i = 0; i < n; ++i) u = max(u, a[i]);
    if(k == 0){
        printf("%lld\n", u);
        return 0;
    }
    while(u - l > 1){
        ll mid = (l + u) / 2;
        if(C(mid)){
            u = mid;
        }
        else{
            l = mid;
        }
    }
    printf("%lld\n", u);
    return 0;
}