maikiichanのブログ

いろいろ

RustでPOJ 3253を解く

POJ 3253、蟻本にも載ってる。身近な問題がモデルになっているが、ハフマン符号を作るときのアルゴリズムとほとんど一緒で、Queueを使って実装すればO(NlogN)で解ける。

この実装では貪欲法でナイーブな実装なので時間計算量は O(n^ 2)になっているけど、Rustの練習的な側面もあるので今回は妥協する。 競技プログラミング的な文脈ではこれで十分ACが取れる。

use std::mem::swap;

fn main() {
    let mut n = 3;
    let mut l = vec![8, 5, 8];

    let mut ans = 0;
    while n > 1 {
        let mut mii1 = 0;
        let mut mii2 = 1;

        if l[mii1] > l[mii2] {
            swap(&mut mii1, &mut mii2);
        }

        for i in 2..n {
            if l[i] < l[mii1] {
                mii2 = mii1;
                mii1 = i;
            } else if l[i] < l[mii2] {
                mii2 = i;
            }
        }

        let t = l[mii1] + l[mii2];
        ans += t;

        if mii1 == n - 1 { swap(&mut mii1, &mut mii2); }
        l[mii1] = t;
        l[mii2] = l[n - 1];
        n -= 1;
    }

    println!("{}", ans);
}

アルゴリズムについての解説は蟻本p.50に任せる。