SRM631に参加。Easyは解けたけど遅く、Mediumは微妙に遠回りな解法してミス。
前回に続き微妙な結果に終わった。
http://community.topcoder.com/stat?c=problem_statement&pm=13393
問題
NxNのグリッド(Nは偶数)があり、各セルの白黒が与えられる。
ここでこのグリッドにおいて、縦にN/2個を超えて連続した同じ色が配置されないようにしたい。
プレイヤーはいくつかの行を選択し、その行をすべて白またはすべて黒にすることができる。
条件を満たすために必要な最少選択行数を求めよ。
解法
中央の2行に白の列と黒の列を作ると、白も黒もN/2個までしか連続しなくなるので、答えは最大でも2であることは明らか。
あとは総当たりで1行白または黒で塗り替えて題意を満たすか試せばよい。
class TaroJiroGrid { public: int N; int okok(vector <string*> G) { int y,x; FOR(x,N) { int c=1; for(y=1;y<N;y++) { if((*G[y])[x]!=(*G[y-1])[x]) c=0; if(++c>N/2) return 0; } } return 1; } int getNumber(vector <string> G) { int a,b,c,i; N=G.size(); string BB="BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"; string WW="WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW"; vector <string*> G2; FOR(a,N) G2.push_back(&G[a]); if(okok(G2)) return 0; FOR(a,N) { G2[a]=&BB; if(okok(G2)) return 1; G2[a]=&WW; if(okok(G2)) return 1; G2[a]=&G[a]; } return 2; } }
まとめ
本番何を思ったかN/2以上、と勘違いして3行書き換えるケースを考えてしまい、時間を損した。