くろたんく雑記帳

日常とか、わんちゃんとか、機械学習とか、競プロとか、

MENU

Python3で解く AtCoder Beginner Contest 151 C - Welcome to AtCoder

単純な数え上げ。問題ごとにACがでるまでWAのカウントをする。

目次

概要

問題

  • 問題は{\displaystyle n}問ある。
  • {\displaystyle m}回提出。
  • 成功すれば{\displaystyle AC}失敗すれば{\displaystyle WA}となる。
  • 1度でも{\displaystyle AC}したらその問題の{\displaystyle AC}の回数は1回。
  • {\displaystyle WA}の回数は問題ごとに{\displaystyle AC}するまでに{\displaystyle WA}した回数である。
  • この時、提出したものの{\displaystyle AC,\  WA}のそれぞれの回数は?

追記:条件にペナルティ数は、高橋君が AC を 1回以上出した各問題において、初めて AC を出すまでに出した WA の数の総和って書いてあった。


解くときに考えた内容

  • {\displaystyle AC}しているかどうかが要なので、問題ごとにTrue, Falseでパターン分け。
    • 問題ごとにboolをリストで持つ
    • {\displaystyle p}問目がまだ{\displaystyle AC}していない状態で {\displaystyle WA}ならインクリメントしていく。

結果的に疑問だったのは、 {\displaystyle p}問目がTrueがでたら、 {\displaystyle p}問目の {\displaystyle WA}の数を足していかないと一部通らなかった。
別に最後に、全部足しても結果変わらないと思うんだけど、どういう例の時に想定と異なることが起きるのかはわからずじまい。

追記: 条件を見落としていた。WAのカウントはACが出ているのが前提なので、ACが出た時点でカウントしなくてはならない。つまり、ACがでていないものはWAがいくらあっても0ってことね。問題はちゃんと読みましょう・・・


コード

n, m = map(int, input().split())
P = [0] * m
S = [0] * m
for i in range(m):
    P[i], S[i] = map(str , input().split())
# 問題によってカウントしたい
WA = [0] * (n+1)
# 全体として何個かがわかればいい
AC = [False] * (n+1)
wa = 0
for i in range(m):
    p = int(P[i])
    # 一度ACになったらその問題は無視
    if AC[p]:
        continue
    # ACになっていない問題の処理
    else:
        # ACになったか判定
        if S[i] == 'AC':
            AC[p] = True
            # ACが通った時のWAのカウントを都度行う必要があるっぽい。違いはわからん
            # 条件でACが出たものに関してWAのカウントをするってなっていた。(条件落としていた。)
            wa += WA[p]
        # ACじゃなかったらWAなので+1していく
        if AC[p] != True:
            WA[p] += 1
# 最後に合計使用するとダメな時がある(条件落としてた)
# wa = sum(WA)(これだとAC出てないものをカウントしちゃう。条件落としてた。)
ac = sum(AC)
print(ac, wa)