phyllo’s algorithm note

レッドコーダーへの道のりは遠い。休んでる場合じゃない!

ABC144 D. Water Bottle

問題

底辺が1辺a cmの正方形で、高さがb cmである直方体に、体積x cm^3の水を入れる。
これを底辺のどれか1辺を軸に傾ける。
水が溢れないように傾けられる最大の角度を求めよ。

制約

  • 1 <= a <= 100
  • 1 <= b <= 100
  • 1 <= x <= a * a * b

解法

θだけ傾けた場合を考える。

このとき、傾けたa cm側とb cm側がどちらも無限に長いと仮定すると、
水面となす三角形のa cm側の長さs cm、b cm側の長さt cmとおけば、
体積は、「s * t * a / 2 = x」、角度から「t/s = tan θ」がわかる。
これからs, tがわかる。

この時点でt >= bであれば、こぼれていることになる。

また、t < bでも、s >= aである場合は、水面反対側の側面に接して台形のような感じになっている。
この場合も、同様に変数をおいて、長さと角度からb cm側の水面の位置が求められる。

これでb cmよりも長ければ、こぼれていることになる。
そうでなければこぼれていない。

あとは、θを二分探索でもとめればよい。