AtCoderのPAST
次のPASTの問題へ
前のPASTの問題へ
第12回PAST J スプリンクラー
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("10 15 3");
//0.1884955592
}
else if (InputPattern == "Input2") {
WillReturn.Add("10 15 6");
//0.6939614954
}
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 H = wkArr[0];
double W = wkArr[1];
double D = wkArr[2];
double OugiRadSum = 2 * Math.PI;
double AreaSum = 0;
// 円が長方形を内包する場合
if (H / 2 * H / 2 + W / 2 * W / 2 <= D * D) {
Console.WriteLine(1);
return;
}
// 円と長方形の右辺が2点で接するかを判定
if (W / 2 < D) {
double ArcCos = Math.Acos(W / 2 / D);
double Height = D * Math.Sin(ArcCos);
AreaSum += 4 * Height * (W / 2) / 2;
OugiRadSum -= 4 * ArcCos;
}
// 円と長方形の上辺が2点で接するかを判定
if (H / 2 < D) {
double ArcCos = Math.Acos(H / 2 / D);
double Height = D * Math.Sin(ArcCos);
AreaSum += 4 * Height * (H / 2) / 2;
OugiRadSum -= 4 * ArcCos;
}
//AreaSum += D * D * Math.PI * OugiRadSum / (2 * Math.PI);
AreaSum += D * D * OugiRadSum / 2;
Console.WriteLine(AreaSum / (H * W));
}
}
解説
長方形の対角線より、半径が長い場合は、
円は、長方形を内包します。
対角線より半径が短い場合は、2点で接点を持つかを判定し、
2点で接点を持つ場合は、三角形の面積を求めつつ、
扇型の面積を求める際の中心角の角度を減らしてます。
また、対称性により、
0度から90度までの面積を求めて、4倍すれば良いです。