ABC271の振り返り(A, B, C, D)
振り返りです。
def test_all(f): for i, data in enumerate(eval(f'test_data{f.__name__[0]}')): exp = data["out"] ans = f(*data["in"]) result = "AC" if exp == ans else "WA" print(f"{i+1} {result}: expected: {exp}, output: {ans}")A - 484558
やってみよう!
A
関数を完成させて「Run」ボタンをクリックしよう!(テストデータ省略)
自由欄
try
フォーマット問題。
書式を全て覚えるのはムリなので、都度都度調べつつ慣れていくしかないですね。
参照)書式指定ミニ言語仕様
def A(N): return f'{N:02X}' print(A(99 )) # 63 print(A(12 )) # 0C print(A(0 )) # 00 print(A(255)) # FF結果:#35272471
自由欄
B - Maintain Multiple Sequences
略
C - Manga
やってみよう!
C
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
try(コンテスト中)
break
の場所を間違えて一度WAした後のAC
結果:#35307073
try(振り返り)
ループ回す回数を間違えて一度WAした後のAC。
なぜ毎度1回は間違えるんだ…!と考えたとき、ミスの場所は違っても結局は確認不足なんだと思い至りました。
サンプルでACしても、追加で境界値周辺のテストケースを作って確認することを心がけます・・・
結果:#36025002
自由欄
D - Flip and Adjust
やってみよう!
D
関数を完成させて「Run」ボタンをクリックしよう!
自由欄
try
「とりあえず数字の小さい方を上に向けた合計を初期値として、表と裏の差の部分和で$S-初期値$を作れればよいのでは?」という方針でググったら以下の記事を見つけました。安定のけんちょんさんです😁
典型的な DP (動的計画法) のパターンを整理 Part 1 ~ ナップサック DP 編 ~ - Qiita
上を参考にしたものの、コンテスト中はACならず。
振り返ってみると判定はOK、カードの置き方の例がダメダメだったので修正したのが以下。
結果:#36031218
try2
上の前に、自力で解いてみたのが以下。
「新たに作れる数のフラグ立てると、これまでに作れる数とごっちゃになっちゃってdpの辿り方が難しいなぁ~」ってことで19行目でコピーしてますが、上ではj >= diff[i]
の場合にdp[i + 1][j] |= dp[i][j - diff[i]]
とすることでそれを回避してるんですね。
う~む、なんか現時点でどちらもシックリきてないです…
def D(N, S, ab): target = S init = [] diff = [] for a, b, in ab: # a < b になるようにする if a >= b : a, b = b, a init.append(1) # 裏(T) else: init.append(0) # 表(H) target -= a diff.append(b - a) if target < 0: return "No" dp = [[1] + [0] * target] for d in diff: new = dp[-1].copy() for i in range(target): if dp[-1][i] and i + d <= 1 target: new[i + d]="1" dp.append(new) if not dp[-1][target]: print("no") return print("yes") v="target" for i, d in enumerate(diff[::-1]): dp[n - i][v]: init[n i] ^="1" print(*["t" c else "h" init], sep )< py-cell> def D(*n): pass test_all(D)結果:#36030811
自由欄