AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC144-D Water Bottle


問題へのリンク


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "Input1";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("2 2 4");
            //45.0000000000
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("12 21 10");
            //89.7834636934
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("3 1 8");
            //4.2363947991
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        double[] wkArr = InputList[0].Split(' ').Select(pX => double.Parse(pX)).ToArray();
        double A = wkArr[0];
        double B = wkArr[1];
        double X = wkArr[2];

        double S = X / A;

        //Console.WriteLine("A={0},B={1},X={2},S={3}", A, B, X, S);

        // 場合分け
        if (2 * S / A >= B) {
            double Hen1 = B - S / A;
            double Hen2 = A / 2;

            // 水筒が満タンの場合
            if (Hen1 == 0) {
                Console.WriteLine(0);
                return;
            }
            double Tan = Hen2 / Hen1;
            double Rad = Math.Atan(Tan);
            double Deg = 90 - Rad / Math.PI * 180;
            Console.WriteLine(Deg);
        }
        else {
            double Hen1 = 2 * S / B;
            double Hen2 = B;

            double Tan = Hen1 / Hen2;
            double Rad = Math.Atan(Tan);
            double Deg = 90 - Rad / Math.PI * 180;
            Console.WriteLine(Deg);
        }
    }
}


解説

まず、体積がXで、これはa*a*bなので
Xをaで割って面積を求めてSとおき、
2次元で考えるようにします。

1リットルのペットボトルでシュミレーションすると
最初に台形となり、次に直角三角形になることが分かります。
三角形になった時に水面がbに到達したかは、不等式で分かります。

あとは、台形でbに到達する場合と
三角形でbに到達する場合で角度のタンジェントを求めて
アークタンジェントから角度を求めてます。