BOJ 2852 NBAバスケットボール


2852号:NBAバスケットボール
1、2チームにはそれぞれ得点時間があり、各チームがリードする総時間がmm:ssの形で出力される問題.
import sys
input = sys.stdin.readline

n = int(input())
score = {1: 0, 2: 0}
time = {1: 0, 2: 0}
ans = {1: 0, 2: 0}
state = 0  # 0 even, 1 team1 leads, 2 team2 leads


for _ in range(n):
    team, t = input().split()
    team = int(team)
    m, s = map(int, t.split(':'))
    t = m*60+s
    score[team] += 1

    if state == 0:
        time[team] = t
        state = team
    elif state != 0 and score[1] == score[2]:
        ans[state] += t-time[state]
        state = 0

if state != 0:
    ans[state] += 60*48-time[state]

print('{:0>2}:{:0>2}'.format(ans[1]//60, ans[1] % 60))
print('{:0>2}:{:0>2}'.format(ans[2]//60, ans[2] % 60))
stateを変数として同点、1チームリード、2チームリードの状態を記す.
xチームがリードしている場合、xチームが得点した場合は処理しなくてもよい.同点->リードまたはリード->同点の状況を処理すればよい.不必要な質問の繰り返しを避けるため、各チームの点数、リード開始時間、総リード時間をディックシャーナに保存する.
コア・ソリューションは次のとおりです.
1)同点から特定のチームがリードするようになればリード開始時間を加えて状態をリードするチームとする.
2)リードしている場合、同点であれば、累積和(入力された得点時間)-(記録されたリード開始時間)に基づき、状態を同点に変換する.
3)入力が終わった後、あるチームがまだリードしている場合、そのチームは累計(全試合時間)-(記録のリード開始時間)を加算する.
mm:ss形式ですが、不要な計算を減らすために秒単位で計算し、出力時のみ演算変換で出力します.
mm:ss形式の出力はformatを用いて0に空席を埋め,{:0>2}に処理する.