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); }