ABC144 D - Water Bottle
問題原文
問題要旨
底面が一辺 の正方形であり、高さが であるような直方体に、 の水が入っている。
この直方体を底面の一辺を軸として傾けたとき、水が溢れ出す時の角度を求めよ。
解法
解説放送を丸パクリします()
立体の問題 → 平面の問題に
立体のままでは考えにくいので、 平面として考えられるようにする。
具体的には、 をやれば、正面から見た時に水がどれぐらいの高さまで入っているかという情報に変換できる。
これを以後 とする。
傾けたときの状態には二種類ある
まず、求めたい角度はここ。
で、このままでは考えにくいので、「直方体は傾けずに中の水の量だけ傾けていく」とすると、ちょうど水が溢れる角度のパターンには2種類あることがわかる。
まずはパターン1。
次にパターン2。
「水の量が全体の半分以上かどうか」で場合わけが必要なことがわかる。
パターン1
こんな感じにやれば、 が求められる。
が求められれば などで角度が求められる。
パターン2
三角形の面積の公式から、 が求められる。
が求められれば などで角度が求められる。
実装
from math import atan2, degrees A, B, X = map(int, input().split()) S = X / A if S >= A * B / 2: h = (2 * (A * B - S)) / A print(degrees(atan2(h, A))) else: w = (2 * S) / B print(degrees(atan2(B, w)))
感想
き ら い 笑
でも atan2
はよく使うらしいから覚えとこう。
当時Twitterはこの問題を作ったwriterさんを燃やす埋めるだのなんか盛り上がってたけど、いま振り返ると普通に良問に見える。 (atan2
の導入によさそう)
すぬけさん大好き