結果
2ペナ4完でした。
温まったので良し。
各問題の感想・解法
B問題
2進数に変換した文字列の並びを逆にしてから、前から見て0の数を数える。
bitをそのまま扱うってことが全然出来ないので、お勉強が必要ですね。
bit関連の演算子さえ怪しいので...
以下コード
II = lambda: int(input()) n = II() bin_n = bin(n)[2:] r = bin_n[::-1] ans = 0 for i in r: if i == "0": ans += 1 else: break print(ans)
C問題
すぐに5進数で考えれば良いことに気づけた。
5進数変換のコードはAIに丸投げしてそのまま動いた。
最初Nをそのまま変換してしまっており、焦ったがすぐ修正できたので良し。
以下コード
def decimal_to_quinary(decimal_number): if decimal_number == 0: return "0" quinary_number = "" while decimal_number > 0: remainder = decimal_number % 5 quinary_number = str(remainder) + quinary_number decimal_number //= 5 return quinary_number II = lambda: int(input()) n = II() quinary_result = decimal_to_quinary(n - 1) ans = "" for i in quinary_result: ans += str(int(i) * 2) print(ans)
D問題
難しかった。
最初は真ん中を頂点と決め打った判定を行ってWA。
次に階段を左右の端から順当に飛ばしたものと比較して、実際の階段の高さと比較して云々~みたいな謎の判定でWA。
Aを左右それぞれから見ながら、各地点における左右に延ばせる距離を保存する。その後、保存したものを重ね合わせて、最小値を取る。これが各地点を頂点としたときのピラミッドのサイズになる。頂点の位置は任意なので、その中の最大値が答えとなる。
頑張って考察して通せたので良かったです。考え方も概ね解説通りでしたし。
ふわっとした感触だけで通していたので、もっと自信もって判断できるようになりたいなぁ、というお気持。
以下コード
II = lambda: int(input()) LMII = lambda: list(map(int, input().split())) n = II() a = LMII() l, r = a[:], a[::-1] count = 0 kaidan_l = [] for i, x in enumerate(l): if count < x: count += 1 else: count = x kaidan_l.append(count) count = 0 kaidan_r = [] for i, x in enumerate(r): if count < x: count += 1 else: count = x kaidan_r.append(count) kaidan_r = kaidan_r[::-1] kaidan_lr = [] for i, j in zip(kaidan_l, kaidan_r): kaidan_lr.append(min(i, j)) print(max(kaidan_lr))
E問題
何も分からない
解説によると桁DPらしい。名前は聞いたことある()
水色行くには、DP関連が一つの壁っぽいので、鉄則本とEDPCで精進します。