AtCoder Beginner Contest 180をPythonで解く

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

Atcoder Python

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

こんにちは, Shinoryoです.

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

A - box

出力すべき解答はNA+Bなので, それを出力します.

n, a, b = [int(i) for i in input().split()]
print(n-a+b)

B - Various distances

次の2つの配列を用意しておくと便利です.

  • xの絶対値を小さい順に並べた配列
  • 上の配列の各要素を二乗した配列

sorted()で並べ替えた配列の最後の値(=最大値)を表示するには[-1]とします.

n = int(input())
absx = sorted([abs(int(i)) for i in input().split()])
squaredx = [i**2 for i in absx]
print(sum(absx))
print(sum(squaredx)**(1/2))
print(absx[-1])

C - Cream puff

すなわち, Nの公約数を羅列するという問題です. i1からNまでループさせて, Niで割り切れるかどうかを調べます. しかし, これだとTLEです.

n = int(input())
for i in range(1,n+1):
if n%i == 0 :
print(i)

Niで割り切れるならば, NN/iでも割り切れることを利用すると, 1からNまでのループで済みます.

(例えば, 62で割り切れるが, 6/2=3でも割り切れる. )

出力は昇順で並べ替える必要があるので, 公約数のリストを一度配列に格納して, sorted()でソートします.

n = int(input())
answer = []
i = 1
while i*i <= n :
if n%i == 0 :
answer.append(i)
if i*i != n :
answer.append(int(n/i))
i += 1
answer = sorted(answer)
for i in range(int(len(answer))):
print(answer[i])

D - Takahashi Unevolved

強さがY以上にならないように, 最も経験値を得る(すなわち最も多く特訓をする)には, 以下のようにします.

  1. 強さXがあまり大きくないときは, 強さがB増えるよりも強さがA倍になった方が, 強さの増加を抑えられる. ゆえに, 強さをA倍にする操作を行う(カコモンジムに通う).
  2. 強さXが十分大きいときは, 強さがA倍になるよりも強さがB増えた方が, 強さの増加を抑えられる. ゆえに, 強さをB増やす操作を行う(AtCoderジムに通う).

「強さXがあまり大きくない」の確認は, X×A<X+B(強さがB増えるよりも強さがA倍になった方が, 強さの増加を抑えられる)かつX×A<Y(A倍しても強さがYに届かない)で行います.

強さXA倍する操作が終了したら, あとは何回Bを加えられるかを考えるだけです.

x, y, a, b = [int(i) for i in input().split()]
exp = 0
# bを足すよりもaをかけた方が経験値が稼げるパターンまで, xを増やし続ける
# (ある段階でbを足した方が経験値が稼げるようになると, それ以降はbを足した方が経験値が稼げる)
while True:
if x*a >= y or x*a >= x+b :
break
exp += 1
x *= a
# 残り分はbを足す
exp += (y - x) // b
# 上の計算だとbを足し続けた結果yになる可能性もあるので, それを確認する
if (y-x) % b == 0:
exp -= 1
print(exp)

E以降

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

参考にしたサイト等

Search

About Me

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

Labels

Blog Archives