u++の備忘録

AtCoder Beginner Contest 127をPythonで解く

AtCoder Beginner Contest 127をPythonで解きました(A〜D)。

atcoder.jp

A - Ferris Wheel(100点)

  • 丁寧に条件分岐
A, B = list(map(int, input().split()))

if (A <= 5):
    print(0)
elif (A >= 13):
    print(B)
else:
    print(B//2)

B - Algae(200点)

  • 漸化式を指示通りに書く
def f(r, D, x):
    return r*x - D


r, D, x = list(map(int, input().split()))

for _ in range(10):
    x = f(r, D, x)
    print(x)

C - Prison(300点)

  • 「左端として一番右にあるゲート」と「右端として一番左にあるゲート」を調べる
  • 解が0個の場合も考えて、maxを取る
N, M = list(map(int, input().split()))
L = [0] * M
R = [0] * M
for i in range(M):
    L[i], R[i] = list(map(int, input().split()))

print(max(0, min(R) - max(L) + 1))

D - Integer Cards(400点)

  • リストAに「書き換える選択肢となる要素」を追加
  • 大きい順にN個取った和が解となる
  • 方針は分かった後にTLEを取るのが難しかった(提出
  • 「書き換える選択肢となる要素」を追加するとき、事前に大きい順にソートしておき、N個より多くは追加しないようにすると通った
N, M = list(map(int, input().split()))
A = list(map(int, input().split()))
cards = [list(map(int, input().split())) for i in range(M)]
cards = sorted(cards, key=lambda x: x[1], reverse=True)

cnt = 0
for card in cards:
    A += [card[1]]*card[0]
    cnt += card[0]
    if cnt >= N:
        break
A.sort(reverse=True)
print(sum(A[:N]))