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に到達する場合で角度のタンジェントを求めて
アークタンジェントから角度を求めてます。