AtCoder Beginner Contest 124 C問題
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の解説動画見て勉強。