ABC221 回想・解説(Python)

前提

AtCoder Biginner Contest221のPythonの解答コードです。

A - Seismic magnitude scales

32のマグニチュードの差分の累乗する。

厳密にはマグニチュードが1増加すると√1000倍≒約32倍、つまり2増加すると1,000倍になるらしい。

A, B = map(int, input().split())
print(32 ** (A - B))

B - typo

制約が小さいので、全探索したらよい。

Pythonはshallow copyなので、そこだけ気をつける。

from copy import copy


S = list(input())
T = list(input())

if S == T:
    print("Yes")
    exit()

for i in range(len(S) - 1):
    s = copy(S)
    s[i], s[i + 1] = s[i + 1], s[i]
    if s == T:
        print("Yes")
        exit()
print("No")

C - Select Mul

bit全探索ですべての組み合わせを計算して最大値を求める。

N = sorted(input(), reverse=True)
ans = 0
for i in range(1 << len(N)):
    l = 0
    r = 0
    for j in range(len(N)):
        if i & (1 << j):
            l = l * 10 + ord(N[j]) - ord("0")
        else:
            r = r * 10 + ord(N[j]) - ord("0")
    ans = max(ans, l * r)
print(ans)

D - Online games

プレイヤーがログインまたはログインしなくなった日をソートして、それを順番に見る。

プレイヤーがログインまたはログインしなくなった日の間は変動はないので、そのタイミングの人数と日付を記録して、配列に格納していく。

N = int(input())
AB = [list(map(int, input().split())) for _ in range(N)]

e = []
for A, B in AB:
    e.append((A, 1))
    e.append((A + B, -1))

e.sort(key=lambda x: x[0])
print(e)
crr = 0
cnt = 0
ans = [0] * (N + 1)
for day, c in e:
    period = day - crr
    crr = day
    ans[cnt] += period
    cnt += c
print(*ans[1:])