Q. 三角関数なんて何に使うの? A. 競プロの問題を解くのに使う

atcoder.jp

この問題を解きました。ネタバレを含むのでご注意ください。

あと最近引っ越しで忙しくて更新が滞ってましたすいませんm(__)m


問題文

高橋君は、底面が1辺 a cmの正方形であり、高さが b cmであるような直方体型の水筒を持っています。(水筒の厚みは無視できます。)
この水筒の中に体積 x cm3 の水を入れ、底面の正方形の1辺を軸として、この水筒を徐々に傾けます。
水を溢れさせずに水筒を傾けることができる最大の角度を求めてください。

制約
入力は全て整数
1 ≤ a ≤ 100
1 ≤ b ≤ 100
1 ≤ x ≤ a2b


まずは、\frac{a^ 2b}{2}\leq x の場合を考えます。

問題を簡単にするために図は2次元にします。

f:id:Kenta-s:20200123174126p:plain

水を溢れさせずにギリギリまで水筒を傾けたとき、水筒と水は以下のようになっています。

f:id:Kenta-s:20200123174944p:plain

このとき、水筒の中の水でない部分を見ると直角三角形ができていて、この直角三角形の左側の内角と求めるべき角が等しいことがわかります。

この直角三角形の辺の一つはすでにわかっている(a)ので、残る辺のいずれかがわかれば逆三角関数で目的の角度を求めることができそうです。

f:id:Kenta-s:20200123175441p:plain

つまり、この図のb'を求めればよいです。


初期状態(傾けていない状態)での水の高さをhとして、まずはhを求めます。

a^ 2h = x なので、 h= \frac{x}{a^ 2}

傾けていない状態での水の部分の面積は

ah

傾けた状態での水の部分の面積は

ab - \frac{ab'}{2}

なので、

ah = ab - \frac{ab'}{2} から

b' = -2(h-b) がわかります。

よって、

\frac{a^ 2b}{2}\leq x のとき

 arctan - \frac{2(h-b)}{a} が答えになります。


続いて \frac{a^ 2b}{2}>x の場合を考えます。

この場合はかなり傾けないと水は溢れません。溢れる寸前の状態は以下のようになっています。

f:id:Kenta-s:20200123180056p:plain

したがって今回求めるべき角と等しいのは下の図のθになります。

f:id:Kenta-s:20200123180634p:plain

この場合も計算でa'を求めて、あとは

 arctan \frac{b}{a'} で答えが出ます。


提出したコード

atcoder.jp

記事内では特に言及してませんが度数法で出力する必要があるので、弧度法->度数法の変換もやっています