🔤

ABC388の振り返り(Python)

2025/01/14に公開

ABC388の振り返り(Python)

ABC388に参加した結果の振り返りと学んだこと、今後の課題の備忘録
使用言語はPythonです
載せているコードは

  • 提出したコードを多少いじったもの
  • 回答などを見て書き直したりコメントだけしたりしたもの

のいずれかで、最適解とかではないです

提出結果

A

https://atcoder.jp/contests/abc388/tasks/abc388_a

一文字目を抜き出して'UPC'とくっつければおっけー

s = input()
print(s[0] + 'UPC')

B

https://atcoder.jp/contests/abc388/tasks/abc388_b

nが小さいので伸ばす長さごと、蛇ごとに重さを求めて比較していけばおっけー

n, d = map(int, input().split())

snakes = []
for i in range(n):
    snakes.append(list(map(int, input().split())))

for k in range(1, d + 1):
    ans = 0
    for i in range(n):
        weight = snakes[i][0] * (snakes[i][1] + k)
        ans = max(ans, weight)
    print(ans)

C

https://atcoder.jp/contests/abc388/tasks/abc388_c

小さい方の餅から見て行って、a番目の餅がb番目の餅に乗るのであればb+1番目以降の餅にも乗せられます。また、a番目の餅がb番目以降の餅に乗るのであれば、a+1番目以降はb番目より前の餅に乗るかどうかを確認する必要はないです。
なので、このbを更新しつつ確認していけばおっけーです。

n = int(input())
moti = list(map(int, input().split()))

index = 1
ans = 0
for ue in range(n):
    for sita in range(index, n):
        # 乗せられる餅を見つけたら、それ以降の餅の数をansに足して次に行く
        if moti[ue] * 2 <= moti[sita]:
            ans += (n - sita)
            break
        else:
            index += 1
    if index >= n:
        break

print(ans)

D

https://atcoder.jp/contests/abc388/tasks/abc388_d

石の数を配列にして毎回確認していった場合は多分TLEします。なので、どの宇宙人まで石を渡せるかを記録しておくことで、受け取る石の数と渡す石の数を順番に計算していけばいいようにしました。

多分どこかで見たいもす法を使った回答を思い出しつつ解いたのですが、引き出しからぱっと出せるようにしておきたいです。

stones = [-1] + list(map(int, input().split()))
# どの宇宙人まで石を渡せるかを辞書として持つ
gifts = {}
# 今見ている宇宙人がもらえる石の数
gift_num = 0

for i in range(1, n + 1):
    # 石の受け取り
    stones[i] += gift_num
    if i in gifts:
        # i番目の宇宙人まで石を渡せる宇宙人がj人いた場合、次からはもらえる石の数がj個減る
        gift_num -= gifts[i]
    
    # 石の徴収
    # 渡せる石の数をgiftに入れ、stonesから引く
    if stones[i] >= (n - i):
        gift = n - i
        stones[i] -= n - i
    else:
        gift = stones[i]
        stones[i] = 0
    
    # プレゼント
    if gift > 0:
        gift_num += 1
        # どの宇宙人まで石を渡せるかを記録する
        if (i + gift) in gifts:
            gifts[i + gift] += 1
        else:
            gifts[i + gift] = 1

print(' '.join(list(map(str, stones[1:]))))

E

https://atcoder.jp/contests/abc388/tasks/abc388_e

餅を半分に分けて、小さい順に乗せられるものを乗せていったら通りました(?)

n = int(input())
moti = list(map(int, input().split()))

ans = 0
moti_ue = moti[:n // 2] + [moti[-1]]
moti_sita = moti[n // 2:]

index = 0
for i in moti_sita:
    if (moti_ue[index] * 2) <= i:
        index += 1
        ans += 1

print(ans)

+ [moti[-1]]を消してもacになるのですが、

5
1 2 4 8 16

のようなケースでエラーになるので、テストケースの不備ですかね?(これに助けられました...)
解説のように二分探索で解くほうが応用もきくと思うので、頭に入れておきたいです

反省点

今回はなし!

感想

入緑うれしい!
しばらくは茶色に落ちないよう気が抜けないです
一年をめどに入水できるよう頑張ります

入水まであと372!

Discussion