for
文のループカウンタ が偶数か奇数かに応じて処理を変える問題!
問題概要
長さが奇数 の文字列 が与えられる。
この文字列に対して、次の操作をすることで、"IOIOIO...OI" というように "I" と "O" を繰り返す文字列にしたい。操作回数の最小値を求めよ。
「好きな文字を選んで、文字を変更する」
制約
解法
最終的に作れる文字列は結局 "IOIOIO...OI" に限られます。よって、この文字列と、文字列 とを比較して、文字が異なる箇所の個数を求めればよいでしょう。
ここで、一般に文字列の先頭の文字は 0 文字目であると考えることにします。このとき、文字列 "IOIOIO...OI" の 番目の文字を考えると
- が偶数のとき ( のとき):'I'
- が奇数のとき ( のとき):'O'
となっていることが分かります。
よって、与えられた文字列 に対して、次のようにすればよいでしょう。答えを求める変数を res
とします。
- が偶数のとき:もし が 'I' でないならば、
res
を 1 増やす - が奇数のとき:もし が 'O' でないならば、
res
を 1 増やす
コード
#include <bits/stdc++.h> using namespace std; int main() { int N; string S; cin >> N >> S; int res = 0; for (int i = 0; i < N; ++i) { if (i % 2 == 0 && S[i] != 'I') ++res; if (i % 2 == 1 && S[i] != 'O') ++res; } cout << res << endl; }