kmjp's blog

競技プログラミング参加記です

TopCoder SRM 631 Div1 Easy TaroJiroGrid

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行書き換えるケースを考えてしまい、時間を損した。