kmjp's blog

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

yukicoder : No.3430 Flip the Grid

コードがかなり短い。
https://yukicoder.me/problems/no/3430

問題

H*Wのグリッドがあり、各セルには0/1のいずれかが書かれている。
2*2の領域を指定し、0/1を反転させることを任意回数行えるとする。
この時、全セルの値の総和の最小値を求めよ。

解法

処理により、各行・列における1の数の偶奇は変化しない。
また、各行・列の1の数は0個か1個にそろえることができる。

その結果、解はmax(1が奇数個の列の数,1が奇数個の行の数)となる。

int H,W;
int R[2020],C[2020];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>H>>W;
	FOR(y,H) FOR(x,W) {
		cin>>k;
		R[y]^=k;
		C[x]^=k;
	}
	x=y=0;
	FOR(i,H) y+=R[i];
	FOR(i,W) x+=C[i];
	cout<<max(x,y)<<endl;
	
}

まとめ

皆証明まできっちりやって提出したのかな?