バイトの競プロメモ

主に競技プログラミング

D - マーブル AtCoder Beginner Contest 004

AtCoder Beginner Contest 004 - AtCoder Beginner Contest 004 | AtCoder

問題概略 

無限個の箱が並んでいる。地点-100には赤がR個、地点0には緑がG個、地点100には青がB個ある。マーブルは隣に動かすことができる。
一つの箱に複数のマーブルが無いようにするには最小で何回マーブルを動かす必要があるか。

解法
まず、最終的な形は赤赤赤.....緑々..青あお というふうに同じ色は連続して、違う色が途中で同じ箱に入ることはない。
よって、最小費用流が使える。

public static void main(String[] args)
    {
        //longを忘れるなオーバーフローするぞ
        int R = ni();
        int G = ni();
        int B = ni();
        startTime = System.currentTimeMillis();
        PrimalDual p = new PrimalDual(5200);
        int s = 1160;
        int t = 1161;
        int rid = 1162;
        int gid = 1163;
        int bid = 1164;
        p.addEdge(s, rid, R, 0);
        p.addEdge(s, gid, G, 0);
        p.addEdge(s, bid, B, 0);
        for (int pos = -500; pos < 500; pos++)
        {
            int plus = 504;
            p.addEdge(rid, pos + plus, 1, abs(-100 - pos));
            p.addEdge(gid, pos + plus, 1, abs(0 - pos));
            p.addEdge(bid, pos + plus, 1, abs(100 - pos));
            p.addEdge(pos + plus, t, 1, 0);
        }
        System.out.println(p.solve(s, t, R + G + B));

        endTime = System.currentTimeMillis();
        System.err.println(endTime - startTime);
    }