ABC265 回想・解説(Python)

前提

AtCoder Biginner Contest265のPythonの解答コードです。

A - Apple

二通りの金額を比較する。

X, Y, N = map(int, input().split())
print(min(X * N, Y * (N // 3) + X * (N % 3)))

B - Explore

愚直にシミュレートして間に合う。ボーナスが設定されている部屋とそうでない部屋を判定するのは手間なので、部屋iに到達すると持ち時間がb[i]増えると読み替えている。ボーナスが設定されていない部屋に到達しても+0時間となるだけなので、問題ない。

N, M, T = map(int, input().split())
A = [0] + list(map(int, input().split()))
b = [0] * (N + 1)
for i in range(M):
    x, y = map(int, input().split())
    b[x] = y


for i in range(1, N):
    if T - A[i] <= 0:
        print("No")
        exit()
    T -= A[i]
    T += b[i + 1]

print("Yes")

C - Belt Conveyor

制約が小さいのでこれもシミュレートする。実装の内容は以下の通り。

  1. マスの文字を読み取る
  2. マスの指示にしたがって移動できるか判定する。
  3. 移動できない場合は現在の一を出力して終了
  4. 移動できる場合は移動する
  5. 移動した先がすでに訪問したことのあるマスだと無限ループに陥るので、-1を出力して終了
  6. 1に戻る
from copy import copy

H, W = map(int, input().split())
grid = [list(input()) for _ in range(H)]

h = set()
p = (0, 0)


def can_move(i, j):
    _i, _j = copy(p)
    return 0 <= (i + _i) <= H - 1 and 0 <= (j + _j) <= W - 1


while True:
    i, j = p
    if grid[i][j] == "U":
        tmp = (-1, 0)
    elif grid[i][j] == "D":
        tmp = (1, 0)
    elif grid[i][j] == "L":
        tmp = (0, -1)
    elif grid[i][j] == "R":
        tmp = (0, 1)
    if not can_move(*tmp):
        print(i + 1, j + 1)
        exit()
    p = (i + tmp[0], j + tmp[1])
    if p in h:
        print(-1)
        exit()
    h.add(p)

D - Iroha and Haiku (New ABC Edition)

予め数列Aの累積和をとっておいて、条件を満たす整数の組が存在するかを判定する。xの値を仮ぎめするとその他の値も一意に決まるので、累積和の中に存在するかを判定する。

N, P, Q, R = map(int, input().split())
A = list(map(int, input().split()))
sum_a = [0] * (N + 1)
for i in range(N):
    sum_a[i + 1] = A[i] + sum_a[i]

s_sum_a = set(sum_a)
for i in range(N):
    x = sum_a[i]
    if x + P in s_sum_a and x + P + Q in s_sum_a and x + P + Q + R in s_sum_a:
        print("Yes")
        exit()
print("No")