草体にぼ日記

だらだらと

ABC047C -一次元リバーシ /1D Reversi

C - 一次元リバーシ / 1D Reversi

提出AC
Submission #8511739 - AtCoder Beginner Contest 047

int main()
{
	cout <<setprecision(10);
	string S;
	cin >> S;
	int n = S.size();
	int count = 0;
	For(i,1,n){
		if(S[i] != S[i-1]){
			count ++ ;
		}
	}
	cout << count << endl;
}

解法

黒と白の区画がいくつあるかだけ数えればいい

白 黒黒黒 白
みたいなとき
左と右に黒を置く(コストは2)
だけど、
そう考えるってよりかは
左にどんどん置いていく
まず一番左に黒
黒 黒 黒黒黒 白
次に一番左にしろ
白白白白白白白
って考えたほうが分かりやすかったです(どちらもコストは2)
黒や白が何個連続していようが、オセロのルール上、白と白 もしくは黒と黒で挟まれた区画
が全部 挟むのに使った色に変換するので
何個連続してるかは関係なくて、何区画あるかが分かればいい。

以後 白 黒 白 は白の区画 黒の区画 白の区画 みたいな感じで考えて

一番左の区画の色と違う色を置くことで区画を1個ずつ減らしていくことが出来て
区画を1までもっていけばいい

つまり、求める答えは区画-1