AtCoder Beginner Contest 183をPythonで解く

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

Atcoder Python

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

こんにちは, Shinoryoです.

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

A - ReLU

if文で条件分岐をすれば問題ないと思います.

x = int(input())
if x >= 0:
print(x)
else:
print(0)

B - Billiards

2点(Sx,Sy), (Gx,Gy)を通る直線とx軸の交点を求めることになります. 2点(Sx,Sy), (Gx,Gy)を通る直線の式は

(1)(GxSx)(ySy)=(GySy)(xSx)

です. これにy=0を代入すればよく, 計算すると

(2)x=Sy(GxSx)+Sx(Gy+Sy)Gy+Sy

となります. これを出力します.

sx, sy, gx, gy = [int(x) for x in input().split()]
print((sy*(gx-sx)+sx*(gy+sy))/(gy+sy))

C - Travel

Pythonで順番を並び替えたもののリストを作成するには, itertools.permutations(リスト)を利用します.

下で「index[(i+1)%n]」としている理由は, i=n1のときにindex[0](つまり都市1のデータ)を参照できるようにするためです.

import itertools
n, k = [int(x) for x in input().split()]
data = [[int(x) for x in input().split()] for _ in range(n)]
nums = list(range(1,n))
ans = 0
for index in itertools.permutations(nums):
index = [0]+list(index)
time = 0
for i in range(n):
time += data[index[i]][index[(i+1)%n]]
if time==k:
ans += 1
print(ans)

D - Water Heater

各時刻で使われているお湯の量を直接求めようとするとO(N)かかるため, 時刻の最大値2×105Tとして時間計算量O(NT)となり, TLE. そのようなコードを参考までに以下に示しておきます.

alltime = 2*(10**5) + 1
table = [0 for _ in range(alltime)]
n, w = [int(x) for x in input().split()]
for i in range(n):
s, t, p = [int(x) for x in input().split()]
for j in range(s, t):
table[j] += p
table = sorted(table, reverse=True)
if table[0] > w:
print("No")
else:
print("Yes")

そこで, いもす法と呼ばれる方法を用います(いもす法に関しては, 下の参考にしたものを参照). 各時刻で使われているお湯の量を直接求めるのではなく, 開始時刻と終了時刻でのお湯の使用量の増減を記録し, 後にそのデータを基にシミュレーションします. 開始時刻と終了時刻の記録にO(N), シミュレーションにO(T)なので, 計算量はO(N+T)となります.

alltime = 2*(10**5)+1
table = [0 for _ in range(alltime)]
n, w = [int(x) for x in input().split()]
for i in range(n):
s, t, p = [int(x) for x in input().split()]
table[s] += p
table[t] -= p
for i in range(1,alltime):
table[i] += table[i-1]
table = sorted(table, reverse=True)
if table[0] > w:
print("No")
else:
print("Yes")

E以降

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

参考にしたもの

Search

About Me

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

Labels

Blog Archives