怠惰の累積和

技術/競プロ/怪文書/虚無

AtCoder Beginner Contest 144 D - Water Bottle

問題概要

 底面がa(cm)の正方形で高さがb(cm)の直方体の容器があり、x(cm^3)の水が入っている。底面の一辺を固定したまま徐々に容器を傾けていく時、何度傾けた時までなら水が零れないか。

atcoder.jp

 

解法

 求める角度をθとする。

 θだけ傾けた時、容器に入っている水の構成する形は三角柱か底面が台形の四角柱になることが分かる。以下この2パターンについてそれぞれ見て行く。

 

 ⅰ)三角柱

 θだけ傾けた時、容器及び水は下図のような状態にある。

f:id:severrabaen:20191101102121j:plain

 θは水面が地面と平行であるから、錯角の関係にある上図の赤色の角度もθとなる。三角柱の底面(図の斜線部)は現状長さbの辺が存在することしかわかっていない。だが、上図のxの長さが判明すると、逆正接(arctan)を応用することにより、θが求まる。C++だとatan2という関数にx,bの長さを与えることで求めることができる。

cpprefjp.github.io

 よって、xの長さを求めることができれば勝ちだが、これは中学受験並みの知識で求めることができる。水はx(cm^3)入っていて、三角柱としての高さはa(cm)であるから、底面積を求めることが容易である(\frac{x}{a}で求まる)。

 底辺α、高さβの三角形の面積は\frac{1}{2}αβで求まるから、これを適切に使用して逆算するとxの長さが求まる。

 ここで、もしx>aであるならば底面は三角形になりえないので、底面は台形、水の形は四角柱だと分かる。そうでないなら先ほどのatan2xbを与え、θを得る。ラジアン表示で返ってくるので適切に度数法に変換してやる必要がある(rad*180/pi=deg)。

 

 ⅱ)四角柱

 θだけ傾けた時、容器及び水は下図のような状態にある。

f:id:severrabaen:20191101103821j:plain

 三角柱の時と同様にやると、赤色の部分がθだと分かるから、atan2ab-xの長さを与えて適切に度数法に変換すれば答えとなる(台形から2辺の長さがaxの長方形を取り去った三角形を考える)。

 底面の台形の面積は先ほどと同様に\frac{x}{a}で求まり、上底α、下底β、高さγの台形の面積は\frac{α+β}{2}γで求まるから、適切に処理することによって、xが求まる。

 よって、atan2ab-xを与えてθラジアン表示で得る。度数法に変換して答え。

 

 上記を実装して、AC。

atcoder.jp