AtCoder Beginner Contest 183をPythonで解く

投稿日: 

Atcoder Python

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

こんにちは, Shinoryoです.

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

A - ReLU

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

B - Billiards

2点$(S_x, S_y)$, $(G_x, - G_y)$を通る直線と$x$軸の交点を求めることになります. 2点$(S_x, S_y)$, $(G_x, - G_y)$を通る直線の式は

\begin{align} \left( G_x - S_x \right) \left( y - S_y \right) &= \left( - G_y - S_y \right) \left( x - S_x \right) \end{align}

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

\begin{align} x &= \frac{S_y \left( G_x - S_x \right) + S_x \left( G_y + S_y \right)}{G_y + S_y} \end{align}

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

C - Travel

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

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

D - Water Heater

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

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

E以降

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

参考にしたもの

Search

About Me

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

Labels

Blog Archives