A | B | C | D | E | F | |
問題文 | ■ | ■ | ■ | ■ | ■ | ■ |
自分の提出 | ■ | ■ | ■ | ■ | ■ | ■ |
結果 | AC | AC | AC | AC | AC | AC |
全体感想
あああ、くだらないミスがなければ優勝できたパターン…。残念。
26 分 2 ペナ → 10位。
問題 F の First AC はとれていたみたいです(問題 F はびっくりするほど簡単だと思った)。
問題F、4:35 で初提出したんですけどWA。「return X >= 0」を「return 1 * (X >= 0)」に変えれば通るやつ。しかも X は 0 以上が保証できるので「return 1」でもよい。
bool 値と int の計算が絡むと適当にキャストされるのでこうしてしまったんですが、この値がその後計算されずに出力されてしまう場合があって。正しい答に紛れてたまに「True」が出力されてしまっていました。とりあえず、自身のバグらせメモに追加します。
6 分 + 2 ペナ を失ってしまい、1 位とれるペースで解けたのが 10 位という結果になってしまった。まぁ、rated じゃないときにレアなミスを引けて、その分上達できたので、良かったです。
問題E – Akari
H, W が巨大でグリッド全体をメモリに置けないと実装量が増えてしんどい思いをすることになりますが、その必要はなかったです。
各電灯から、一方向。例えば下にのみ光が発せられる問題を解きます。これを 4 方向について解いてマージすればよいです。
下方向にのみ光が発せられる場合には、上の行から順にループしていけば簡単に解けます。
res = np.zeros((H, W), np.bool_) # 光ったマス
for _ in range(4):
res, G = res.T[::-1], G.T[::-1]
# 下方向に解く
A = np.zeros_like(res)
H, W = A.shape
for h in range(H):
if h >= 1:
A[h] |= A[h - 1]
A[h][G[h] == 1] = 1
A[h][G[h] == -1] = 0
res |= A
提出コード(https://atcoder.jp/contests/abc182/submissions/17968851)より。
G に、グリッドの情報が入っています。(電灯を 1、ブロックを -1 とした (H,W) の 2 次元配列)。自身を含む下方向に光を発するとして解いて、解いた結果が A に入るようにします。
for _ in range(4):
res, G = res.T[::-1], G.T[::-1]
ここの部分が、

転置と逆転を適当な順序で
なお、numpy.ndarray のこの手の操作は、配列のコピーを行わず同じメモリ領域の参照方法のみを変える(view をかえす)ため、配列が巨大であっても定数時間です。
問題F – Valid payments
例えば硬貨が 1, 5, 10 円であるとします。
例えば
もともと最小の硬貨を支払うパターンのない場合もある:
この手の考察は、通常「桁 dp」と呼ばれることが多いと思います。基本的な桁 dp はすべて(多分?)、「
メモ化再帰はかなりお手軽実装で、64 bit 整数範囲を相手にするだけならかなり推奨できると思います。
- 左から
桁分を見たとき、 円を支払う方法 / 円を支払う方法
のように、