犠牲者の心臓に電気ショックを与えるために最寄りのAEDを探し出すゲーム(たぶん)
小数点がピリオド(.)じゃなくてコンマ(,)になってるのは罠か。
何も知らずにdouble.Parseして計算したら地球何十周レベルの長大な距離になって、患者死ぬやろ…って思ったわ。
using System; using System.Linq; using System.IO; using System.Text; using System.Collections; using System.Collections.Generic; /** * Auto-generated code below aims at helping you parse * the standard input according to the problem statement. **/ class Solution { static void Main(string[] args) { double LON = DegreeToRadian(Console.ReadLine()); //経度(ラジアン) double LAT = DegreeToRadian(Console.ReadLine()); //緯度(ラジアン) int N = int.Parse(Console.ReadLine()); //DEFIBの数 string name = null; //一番近い場所の名前 double nearest = double.MaxValue; //一番近い場所の距離 for (int i = 0; i < N; i++) { string[] DEFIB = Console.ReadLine().Split(';'); //DEFIBの場所データを分割して取得 double dlo = DegreeToRadian(DEFIB[DEFIB.Length-2]); //DEFIBの経度(ラジアン) double dla = DegreeToRadian(DEFIB[DEFIB.Length-1]); //DEFIBの緯度(ラジアン) double dis = GetDistance(LON, LAT, dlo, dla); //距離の取得 if(dis < nearest) { //一番近い場所の更新 name = DEFIB[1]; nearest = dis; } } // Write an action using Console.WriteLine() // To debug: Console.Error.WriteLine("Debug messages..."); Console.WriteLine(name); } //距離を得る //引数 double alo : 犠牲者の経度 //引数 double ala : 犠牲者の緯度 //引数 double blo : 除細動器の経度 //引数 double bla : 除細動器の経度 //戻り値 double : 距離 static double GetDistance(double alo, double ala, double blo, double bla) { double x = (blo - alo) * Math.Cos((ala + bla) / 2.0); double y = bla - ala; return Math.Sqrt(x * x + y * y) * 6371; } //度数法から弧度法へ変換 //引数 string d : 角度(度数法) //戻り値 double : 角度(弧度法) static double DegreeToRadian(string d) { string[] ds = d.Split(','); //小数がコンマ区切りなのでいったん分割 double deg = double.Parse(ds[0]) + double.Parse("0."+ds[1]); //結合 return Math.PI * deg / 180.0; } }