2009 Round2
去年よりも圧倒的に難しくて、これはダメだ、って感じだったけれど、システムテスト後で421位らしい。ほとんど気合い実装で通したとしか言いようがない...。
A
0と1からなる行列が与えられて、行のスワップだけで、下三角行列に変換する最小回数を答えよ、という問題。
smallは8行だったので、メモしつつBFSした。結局上から順に、Greedyに入る一番近い子をスワップで拾ってくるだけだった。
B
自分の立っている場所の右下か左下を掘ることができる状況で、一番下の層まで降りたい。無事に降りられる段数が決まっていて、降りるときは常に垂直に落下する。このとき、無事に最下層に到着するために、掘る最小回数を答えよ、という問題。
今の位置と、同じ層と下の層の形状を状態にしてDPするだけ。遷移がやたらと多くて大変。largeは手に負えなかった...。
C
グラフがN個与えられる。重ならないグラフは一枚に書くことができるとするとき、少なくとも何枚に分けて書く必要があるか答えよ、という問題。
重なるかどうかでグラフ作って、クリーク(?)は一枚に書ける...、みたいな問題なのは分かるけれど、グラフはさっぱり分からないので、仕方がないからQM法のようなものを作ってsmallだけ。ArrayListが遅くてダメだったりしたので、整数配列にするとか微妙な高速化で通した。
D
N個の円を含むように2個円を書く。このとき円の半径の最小値を答えよ、という問題。
smallはNが3以下なので場合わけ。1個ならその円の半径、2個なら大きい方の半径、3個なら、2個と1個に分けて、大きい方。2個の円を含む円は、中心距離と二つの円の半径の和が直径になる。