AtCoder Beginner Contest 124 C問題

Tasks - AtCoder Beginner Contest 124

A:4分
B:12分
C:×
D:×

C問題、これでいけると思ったのだけど1caseだけACがとれず。なんで~~~

#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  cin >> S;
  int N = S.size();
  int count = 0;
  
  /**
  並び順のパターンとしては以下の4通り(0,1が反転してても結局同じ)
  それぞれに対応する操作は
  000~ 1番目を反転
  010~ そのまま
  001~ 0番目を反転
  011~ 2番目を反転
  これをforで順番に判定していけば必要な反転回数が分かる...はず
  **/
  
  for (int i = 0; i < (N - 2); i++){
    if (S.at(i) != S.at(i + 1) && S.at(i) != S.at(i + 2)){
      count++;
      S.at(i + 2) = S.at(i);
    } else if (S.at(i) == S.at(i + 1) && S.at(i) != S.at(i + 2)){
      count++;
      S.at(i) = S.at(i + 2);
    } else if (S.at(i) == S.at(i + 1) && S.at(i) == S.at(i + 2)){
      count++;
      if (S.at(i + 1) == '0'){
        S.at(i + 1) = '1';
      } else {
        S.at(i + 1) = '0';
      }
    }
  }
  // N=2 のときに対応
  if (N == 2 && S.at(0) == S.at(1)){
    count++;
  }
  
  cout << count << endl;
}


editorial を読んでようやく最終パターンが白黒白黒~,黒白黒白~の2パターンだけしかないことに着目できた。なんで気づかなかった...。早速実装したら一発でACとれた。

#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  cin >> S;
  int N = S.size();
  int count = 0;
  int count_b = 0;
  int count_w = 0;
  
  //黒からor白からの2パターンだけ調べればよい
  
  //黒スタート//
  for (int i = 0; i < N; i++){
    if (i % 2 == 0){
      if (S.at(i) == '1'){
        count_b++;
      }
    } else {
      if (S.at(i) == '0'){
        count_b++;
      }
    }
  }
  
  //白スタート//
  for (int i = 0; i < N; i++){
    if (i % 2 == 0){
      if (S.at(i) == '0'){
        count_w++;
      }
    } else {
      if (S.at(i) == '1'){
        count_w++;
      }
    }
  }    
  count = min(count_b, count_w);  
  cout << count << endl;  
}


d問題は、youtubeの解説動画見て勉強。