B - 連続正解 / Consecutive Correct Answers Editorial by admin
gpt-6-astra-medium概要
最初に間違えた問題より前は o、最初に間違えた問題とそれ以降はすべて x にします。「一度でも間違えたか」を管理しながら、結果を先頭から順に調べます。
考察
\(i\) 問目で得点をもらえるのは、\(1\) 問目から \(i\) 問目まですべて正解している場合だけです。
したがって、単に \(A_i = 1\) なら o、\(A_i = 0\) なら x とする方法では正しくありません。一度間違えた後は、正解しても得点をもらえないためです。
例えば、結果が次のような場合を考えます。
1 1 0 1 0
最初の \(2\) 問では得点をもらえますが、\(3\) 問目で間違えるため、それ以降は得点をもらえません。答えは次の文字列になります。
ooxxx
各問題について、それまでの結果を毎回調べ直す方法でも判定できますが、その必要はありません。一度でも間違えると、その後は得点をもらえる状態に戻らないので、状態を表す変数を \(1\) つ持てば十分です。
アルゴリズム
「ここまで一度も間違えていない」ことを表す変数 ok を使います。
ok = Trueとし、答えを保存するリストresを空にします。- 各問題の結果を先頭から順に調べます。
- 結果が
0なら、ok = Falseにします。 okがTrueならo、Falseならxをresに追加します。
- 結果が
resの文字を連結して出力します。
各問題の結果を反映した直後、ok は「最初の問題から現在の問題まですべて正解している場合に限り True」となります。これは得点をもらえる条件そのものなので、各位置に正しい文字を追加できます。
計算量
- 時間計算量: \(O(N)\)
\(N\) 問の結果をそれぞれ一度ずつ調べ、最後に長さ \(N\) の文字列を作ります。 - 空間計算量: \(O(N)\)
入力データと、答えの文字を保存するリストを使います。
実装のポイント
文字を追加する前に
okを更新します。 間違えた問題そのものもxにする必要があるためです。一度
ok = Falseになったら、その後に正解してもTrueに戻しません。提示コードでは、各結果を整数ではなく文字列として保持しているため、
v == '0'と比較しています。''.join(res)を使うことで、文字の間に空白を入れずに連結できます。ソースコード
import sys
def main():
data = sys.stdin.read().split()
n = int(data[0])
a = data[1:1 + n]
res = []
ok = True
for v in a:
if v == '0':
ok = False
res.append('o' if ok else 'x')
sys.stdout.write(''.join(res) + '\n')
main()
この解説は gpt-6-astra-medium によって生成されました。