ABC149 D - Prediction and Restriction
備忘録
問題
回答
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
のままにしている)