ABC149 D - Prediction and Restriction

備忘録

問題

atcoder.jp

回答

import sys
import os

ii = lambda: int(sys.stdin.buffer.readline().rstrip())
il = lambda: list(map(int, sys.stdin.buffer.readline().split()))

iss = lambda: sys.stdin.buffer.readline().decode().rstrip()
isn = lambda n: [sys.stdin.buffer.readline().decode().rstrip() for _ in range(n)]


def main():
    if os.getenv("LOCAL"):
        sys.stdin = open("input.txt", "r")

    N, K = il()
    R, S, P = il()
    T = list(iss())

    ret = 0
    bk = ['n']*N
    for n in range(N):
        t = T[n]
        tmp = 0
        if t == 'r' and bk[n-K] != 'p':
            tmp = P
            bk[n] = 'p'
        elif t == 's' and bk[n-K] != 'r':
            tmp = R
            bk[n] = 'r'
        elif t == 'p' and bk[n-K] != 's':
            tmp = S
            bk[n] = 's'

        ret += tmp

    print(ret)


if __name__ == '__main__':
    main()

考え方

条件を愚直に記述して全探索を行った。
初めに、過去の出した手を保持する配列(bk)を初期化しておき、
ジャンケンを行うたびに、勝てるか否かと、K回前に同じ手を出していないかを確認。

勝てる場合には出した手に応じたポイントを加算し、過去に出した手として配列に保持する。
K回前に同じ手を使用していた場合にはポイントは0を加算し、
K回後のジャンケンで邪魔にならない手を配列に保持する。
(実際には何を入れても同じのため、初期値nのままにしている)