ABC336参加記

結果

2ペナ4完でした。
温まったので良し。


各問題の感想・解法

A問題

書くだけですね。
以下コード

II = lambda: int(input())
n = II()
print("L" + "o" * n + "ng")
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で精進します。