AtCoder Beginner Contest

【pythonでABC184を解説】B - Quizzes

問題概要

問題ページ

問題文

高橋くんは、 \(N\) 問のクイズに答えます。
高橋くんの持っている点数ははじめ \(X\) 点で、クイズに正解すると \(1\) 点増え、不正解だと \(1\) 点減ります。
ただし、持っている点数が \(0\) 点のときに不正解となった場合は点数は減りません。

高橋くんのクイズの結果が文字列 \(S\) で与えられます。
\(S\) の左から \(i\) 番目の文字が o のとき、 \(i\) 問目が正解だったことを、 x のとき、 \(i\) 問目が不正解だったことを表します。
高橋くんの最終的な点数はいくつでしょうか?

制約

  • \(1 \le N \le 2 \times 10^5\)
  • \(0 \le X \le 2 \times 10^5\)
  • \(S\) は ox からなる長さ \(N\) の文字列

問題の考察

高橋くんの各解答が正解だったか不正解だったかを順に判定していけば良い。

ただし、得点が\(0\)未満になることがないので注意したい。

xが\(0\)未満にならないという部分は、x = max(x - 1, 0)とコーディングすればよい。

ACコードでは、高橋くんの\(i\)番目の解答s[i]も同時に判定するためにx = max(x - 1 if s[i] == "x" else x + 1, 0)s[i]xならxから1を引いた数と\(0\)の大きい方、x以外ならx+1)とコーディングしている。

たびすけ
max(\(x, 0\))のようにすれば、xの値に下限の設定がある場合にも簡単にコーディングできます!

ACコード

import sys


def solve():
    input = sys.stdin.readline
    mod = 10 ** 9 + 7
    n, x = list(map(int, input().rstrip('\n').split()))
    s = str(input().rstrip('\n'))
    for i in range(len(s)):
        x = max(x - 1 if s[i] == "x" else x + 1, 0)
    print(x)


if __name__ == '__main__':
    solve()

-AtCoder Beginner Contest
-