けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

JOI 一次予選 2021 (第 3 回) B - IOI 文字列 (7Q, 難易度 2)

for 文のループカウンタ  i が偶数か奇数かに応じて処理を変える問題!

問題概要

長さが奇数  N の文字列  S が与えられる。

この文字列に対して、次の操作をすることで、"IOIOIO...OI" というように "I" と "O" を繰り返す文字列にしたい。操作回数の最小値を求めよ。

「好きな文字を選んで、文字を変更する」

制約

  •  1 \le N \le 99

解法

最終的に作れる文字列は結局 "IOIOIO...OI" に限られます。よって、この文字列と、文字列  S とを比較して、文字が異なる箇所の個数を求めればよいでしょう。

ここで、一般に文字列の先頭の文字は 0 文字目であると考えることにします。このとき、文字列 "IOIOIO...OI" の  i 番目の文字を考えると

  •  i が偶数のとき ( i = 0, 2, 4, \dots のとき):'I'
  •  i が奇数のとき ( i = 1, 3, 5, \dots のとき):'O'

となっていることが分かります。

よって、与えられた文字列  S に対して、次のようにすればよいでしょう。答えを求める変数を res とします。

  •  i が偶数のとき:もし  S_{i} が 'I' でないならば、res を 1 増やす
  •  i が奇数のとき:もし  S_{i} が '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;
}