はまやんはまやんはまやん

hamayanhamayan's blog

Water Bottle [AtCoder Beginner Contest 144 D]

https://atcoder.jp/contests/abc144/tasks/abc144_d

解説

https://atcoder.jp/contests/abc144/submissions/8169237

数学的な問題のようだ。
0°の状態から傾けていくと、水の形は最初長方形だが、台形の柱となり、三角柱となりと遷移する。
三角柱になる前に溢れる可能性もあるが、この境目は体積の半分になる。
溢れる寸前の角度をθとする。

水が体積の半分より少ない場合は、三角柱となってから、ある角度でこぼれる。
溢れる寸前の時の底面の長方形がy×aになっているとすると、aby/2=xとなるので、y=2x/abである。
すると、tanθ=b/yなので、tanθ=ab2/(2x)である。よって、θ=atan(ab2/(2x))が答え。

水が体積の半分より多い場合は、台形の柱の状態で、ある角度でこぼれる。
作られる台形の切り取られている部分の長さbの辺の残りの部分をyとすると、
y=2b-2x/a2となる。tanθ=y/aとなるので、θ=atan((2b-2x/a2)/a)が答え。

atanは弧度法になってるので、/π*180で度数法に変換して答える。

double A, B, X;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> A >> B >> X;

    double half = A * A * B / 2;
    double ans;

    if (X < half) ans = atan(A * B * B / (2.0 * X));
    else ans = atan((2.0 * B - 2.0 * X / (A * A)) / A);

    ans = ans / PI * 180;

    printf("%.10f\n", ans);
}