AtCoder Beginner Contest 182をPythonで解く

投稿日:  更新日:2022/09/02

Atcoder Python

B!
Daniel AgreloによるPixabay(https://pixabay.com/)からの画像

こんにちは, Shinoryoです.

今回はAtCoder Beginner Contest 182を, Pythonで解いてみた結果を書き連ねていこうと思います.

A - twiblr

求める値は2A+100Bとなるので, それを出力します.

a, b = [int(x) for x in input().split()]
print(2*a+100-b)

B - Almost GCD

k2からAの最大値(もちろん1000まででも問題ありません)までループさせて, 各kに対してGCD度を求めます. そして, 最もGCD度が大きかったときのkを出力します.

n = int(input())
a = sorted([int(x) for x in input().split()], reverse=True)
gcdmax, ans = 0, 0
for k in range(2, a[0]+1):
gcdtemp = sum(a[i] % k == 0 for i in range(n))
if gcdmax < gcdtemp:
gcdmax, ans = gcdtemp, k
print(ans)

C - To 3

Pythonで組み合わせのリストを作成するには, itertools.combinations(リスト)を利用します.

Nの桁のうち0個を消した場合, 1個を消した場合, ……と順に試していき, 3で割り切れた場合に消した桁数を出力します. 3で割り切れるかどうかの判定は, 各桁の数字の合計が3で割り切れるかどうかで行います.

import itertools
n = [int(x) for x in list(input())]
k = len(n)
for i in range(k+1, 0, -1):
for c in itertools.combinations(n, i):
if sum(c) % 3 == 0:
print(k-i)
exit()
print(-1)

D - Wandering

愚直に行うとO(N2)かかるため, TLE. そのようなコードを参考までに以下に示しておきます.

n = int(input())
a = [int(x) for x in input().split()]
resultmax, result = 0, 0
for i in range(n):
for j in range(i+1):
result += a[j]
resultmax = max(resultmax, result)
print(resultmax)

そこで, 「正の向きにA1進み, 正の向きにA2進み, 正の向きにA3進み, …, 正の向きにAi進む」という一連の動作を動作iとします.

  • ある変数pに対して, Aiを順に足していくことで「動作iの合計の座標の変化」が分かります.
  • また, pが最大だったときの値を(変数qに)保存し続けることで, 「動作iを座標0で始めた場合の, 開始から終了までの座標の最大値」が分かります.
  • さらに, pを順に足し続けてきたある変数xに対して, qを足すことで「動作iが行われている間の座標の最大値」が分かります.
  • つまり, xが最大だったときの値を(変数rに)保存し続けることで, 求める最大値を得ることができます.

この方法ならO(N)ですみます.

n = int(input())
a = [int(x) for x in input().split()]
x, r, p, q = 0, 0, 0, 0
for i in range(n):
p += a[i]
q = max(p, q)
r = max(r, x+q)
x += p \n
print(r)

E以降

E以降は私の能力不足故に省略いたします.

参考にしたサイト等

Search

About Me

自分の写真
理系大学生でした. Bloggerを利用して発信を行っています.

Labels

Blog Archives