3/02/2007

SRM 328 div1 level 1

どんどん解いちゃうな。ヤバイ。

Nが40までならごり押しでいける。全点を全時間で、隣接するライトがOFFなら色をつけて・・・を繰り返す。全点が怖かったので、ちょっと工夫して
  • 色の数の要素数でArrayList[]を作成して、そこに点灯したライトの座標int[]を入れていく
    毎回、ArrayListを引っ張り出してfor(int i=array.size()-1;i>=0;i--)でループすれば
    このArrayListに要素を追加しても最初の終了条件のままループできる(最後に追加するので)
  • ライトを点灯したらcount++して、count<n*n*nの間、whileでループするようにする
  • boolean[][][] memを用意して、点灯したらtrueにすることで点灯したことを判別
として高速化した。

しかし、解説にあるSnapDragonsolution、すごいな。
  • ある点の最終的な色は、色のスタート地点からのマンハッタン距離(格子上の距離)が最も近い色となる
  • 各点において各色からのマンハッタン距離(abs(x0-x)+abs(y0-y)+abs(z0-z))を計算して最小の色に+1
以上。これをマンハッタン距離の最短距離問題にして考えるとは、さすが。4重ループ(全点+全色)で一発終了。