ABC182 - Atcoder/Python精進のための解説メモ

2020/11/26

ABC182 - A.twiblr

AtCoder公式 | ABC182 - A.twiblr

解答

a, b = map(int, input().split())
print(2 * a + 100 - b if 2 * a + 100 > b else 0)

要点メモ

  • やるだけ

ABC182 - B.Almost GCD

AtCoder公式 | ABC182 - B.Almost GCD

解答

n = int(input())
aaa = list(map(int, input().split()))
ans = 0
cnt = 0
for i in range(2, max(aaa) + 1):
    tmp = 0
    for j in range(n):
        if aaa[j] % i == 0:
            tmp += 1
    if tmp >= cnt:
        cnt = tmp
        ans = i
print(ans)

要点メモ

  • 整数kが2以上1000以下であることに注目する
  • aのmax値より大きい値ではGCD度が1になるので調べなくてよい

ABC182 - C.To 3

AtCoder公式 | ABC182 - C.To 3

解答

n = input()
n = [int(ni) % 3 for ni in n]
sum_n = sum(n) % 3
ans = 0
if sum_n == 0:
    pass
elif sum_n == 1:
    if 1 in n and len(n) > 1:
        ans = 1
    elif n.count(2) >= 2 and len(n) > 2:
        ans = 2
    else:
        ans = -1
else:
    if 2 in n and len(n) > 1:
        ans = 1
    elif n.count(1) >= 2 and len(n) > 2:
        ans = 2
    else:
        ans = -1
print(ans)

要点メモ

  • 丁寧ていね丁寧に場合分けする問題
  • ちゃんと手書きで分岐を整理してからコード書いたほうがミスがなくて良さそう

ABC182 - D.Wandering

AtCoder公式 | ABC182 - D.Wandering

解答

from itertools import accumulate

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

ans = 0
x = 0

acc = list(accumulate(aaa))
acc_max = list(accumulate(acc, func=max))

for i in range(n):
    ans = max(ans, x + acc_max[i])
    x += acc[i]

print(ans)

要点メモ

  • 実際に書いてみると累積和in累積和を使って、各i(=1, 2,..., n)動作中の最大値を出して、1番大きい値を出せば良いと気づく
  • 累積和を自前で実装してTLEだったので、ミスを避けるためにも素直にaccumulate使ったほうが良さそう