振り返りです。

AtCoder Beginner Contest 265 - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
from copy import deepcopy def test_all(f): for i, data in enumerate(eval(f'test_data{f.__name__[0]}')): exp = data["out"] ans = f(*deepcopy(data["in"])) result = "AC" if exp == ans else "WA" print(f"{i+1} {result}: expected: {exp}, output: {ans}")

A - Apple

B - Explore

B - Explore

やってみよう!

B関数を完成させて「Run」ボタンをクリックしよう!

test_dataB = [ { "in":[4, 1, 10, [5, 7, 5], [[2, 10]]], "out": "Yes" },{ "in":[4, 1, 10, [10, 7, 5], [[2, 10]]], "out": "No" }, ] def B(N, M, T, A, XY): pass test_all(B)

自由欄

try

インデックスの持ち方と判定のタイミングに気を遣う問題です。

def B(N, M, T, A, XY): B = [0] * len(A) for x, y in XY: B[x - 1] = -y for a, b in zip(A, B): T -= b T -= a if T <= 0: return "No" return "Yes" test_all(B)

結果:提出 #34212608

自由欄

C - Belt Conveyor

C - Belt Conveyor

やってみよう!

C関数を完成させて「Run」ボタンをクリックしよう!

test_dataC = [ { "in":[2, 3, [['R', 'D', 'U'], ['L', 'R', 'U']]], "out": [1, 3] },{ "in":[2, 3, [['R', 'R', 'D'], ['U', 'L', 'L']]], "out": [-1] },{ "in":[9, 44, [['R', 'R', 'D', 'D', 'D', 'D', 'R', 'R', 'R', 'D', 'D', 'D', 'R', 'R', 'R', 'R', 'R', 'R', 'D', 'D', 'D', 'R', 'D', 'D', 'D', 'D', 'R', 'D', 'D', 'R', 'D', 'D', 'D', 'D', 'D', 'D', 'R', 'R', 'D', 'R', 'R', 'R', 'R', 'R'], ['R', 'R', 'R', 'D', 'L', 'R', 'D', 'R', 'D', 'L', 'L', 'L', 'L', 'R', 'D', 'R', 'R', 'L', 'L', 'L', 'D', 'D', 'R', 'D', 'L', 'L', 'L', 'R', 'D', 'D', 'D', 'L', 'L', 'L', 'D', 'R', 'R', 'L', 'L', 'L', 'L', 'L', 'D', 'D'], ['D', 'R', 'D', 'L', 'R', 'L', 'D', 'R', 'D', 'L', 'R', 'D', 'R', 'L', 'D', 'R', 'L', 'R', 'D', 'D', 'L', 'D', 'D', 'L', 'R', 'D', 'R', 'L', 'D', 'R', 'L', 'D', 'D', 'R', 'L', 'R', 'R', 'L', 'R', 'R', 'R', 'D', 'R', 'R'], ['D', 'D', 'L', 'R', 'R', 'D', 'L', 'D', 'D', 'L', 'D', 'D', 'R', 'L', 'D', 'D', 'L', 'D', 'R', 'D', 'D', 'R', 'D', 'D', 'D', 'D', 'R', 'L', 'R', 'R', 'L', 'R', 'D', 'D', 'R', 'R', 'R', 'L', 'D', 'R', 'D', 'R', 'D', 'D'], ['R', 'D', 'L', 'R', 'R', 'D', 'L', 'R', 'D', 'L', 'L', 'L', 'L', 'R', 'R', 'D', 'L', 'R', 'D', 'R', 'R', 'D', 'R', 'R', 'R', 'D', 'L', 'R', 'D', 'D', 'L', 'L', 'L', 'L', 'D', 'D', 'D', 'L', 'L', 'L', 'L', 'R', 'D', 'R'], ['R', 'D', 'L', 'L', 'L', 'L', 'L', 'R', 'D', 'L', 'R', 'D', 'R', 'L', 'D', 'D', 'L', 'D', 'D', 'R', 'D', 'R', 'R', 'D', 'R', 'L', 'D', 'R', 'R', 'R', 'L', 'D', 'D', 'D', 'L', 'D', 'D', 'D', 'R', 'D', 'D', 'L', 'D', 'R'], ['R', 'D', 'L', 'R', 'R', 'D', 'L', 'D', 'D', 'L', 'R', 'D', 'R', 'L', 'R', 'D', 'L', 'D', 'D', 'D', 'L', 'D', 'D', 'R', 'L', 'D', 'R', 'D', 'R', 'D', 'L', 'D', 'R', 'D', 'L', 'D', 'D', 'L', 'R', 'R', 'D', 'L', 'R', 'R'], ['R', 'D', 'L', 'D', 'R', 'R', 'L', 'D', 'R', 'L', 'L', 'L', 'L', 'D', 'R', 'D', 'R', 'L', 'L', 'L', 'R', 'D', 'D', 'L', 'L', 'L', 'L', 'L', 'R', 'D', 'R', 'L', 'L', 'L', 'R', 'R', 'R', 'R', 'L', 'L', 'L', 'D', 'D', 'R'], ['R', 'R', 'R', 'R', 'D', 'R', 'D', 'D', 'R', 'R', 'R', 'D', 'D', 'R', 'D', 'D', 'D', 'R', 'R', 'R', 'D', 'R', 'D', 'R', 'D', 'R', 'D', 'R', 'R', 'R', 'R', 'R', 'R', 'D', 'D', 'D', 'R', 'D', 'D', 'D', 'D', 'R', 'R', 'R']]], "out": [9, 5] }, ] def C(H, W, G): pass test_all(C)

自由欄

try

def C(H, W, G): move = { "U":lambda h, w: [h-1, w] if h != 0 else None, "D":lambda h, w: [h+1, w] if h != H-1 else None, "L":lambda h, w: [h, w-1] if w != 0 else None, "R":lambda h, w: [h, w+1] if w != W-1 else None, 0:lambda h, w: -1 } h = 0 w = 0 while True: nex = move[G[h][w]](h, w) if nex == -1: return [nex] if nex is None: break G[h][w] = 0 h, w = nex return [h+1, w+1] test_all(C)

結果:提出 #34226831

自由欄

D - Iroha and Haiku (New ABC Edition)

D - Iroha and Haiku (New ABC Edition)

やってみよう!

D関数を完成させて「Run」ボタンをクリックしよう!

test_dataD = [ { "in":[10, 5, 7, 5, [1, 3, 2, 2, 2, 3, 1, 4, 3, 2]], "out": "Yes" },{ "in":[10, 5, 7, 5, [2, 1, 2, 2, 2, 3, 1, 2, 1, 1]], "out": "Yes" },{ "in":[9, 100, 101, 100, [31, 41, 59, 26, 53, 58, 97, 93, 23]], "out": "No" },{ "in":[7, 1, 1, 1, [1, 1, 1, 1, 1, 1, 1]], "out": "Yes" }, ] def D(N, P, Q, R, A): pass test_all(D)

自由欄

try

解説の通り、累積和と二分探索の組み合わせ。
ちなみに解説の「実装上は S をsetで保持することで、明示的に二分探索を行う必要がなくなります」は、Pythonには当てはまらなさそうです。

from itertools import accumulate from bisect import bisect def D(N, P, Q, R, A): *acc, = accumulate([0] + A) for i in range(N): s = i for total in [P, Q, R]: idx = bisect(acc, total + acc[s]) if idx <= len(acc) and acc[idx-1] == total + acc[s]: s = idx-1 else: break else: return "Yes" return "No" test_all(D)

結果:提出 #35084803

自由欄

自由欄