Pongeponge

Codingame『Defibrillators』

日本光電 AED 自動体外式除細動器 カルジオライフ AED-2100


 犠牲者の心臓に電気ショックを与えるために最寄りの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;
    }
}