Codingame『Network Cabling』クリア

CablesCables / Nika


 平均を求めてもうまくいかないので、中央値を求めたら通った。
めっちゃくちゃ悩んだわ!!


using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;

class Solution
{
    static void Main(string[] args)
    {
        //中央値
        int median;

        //ケーブルの長さ
        double l = 0;

        //ビルの数
        int N = int.Parse(Console.ReadLine());
        Position[] buildings = new Position[N];

        //ビルの座標を取得
        for (int i = 0; i < N; i++)
        {
            string[] inputs = Console.ReadLine().Split(' ');
            buildings[i] = new Position(int.Parse(inputs[0]), int.Parse(inputs[1]));
        }

        //Y軸昇順ソート
        Array.Sort(buildings,
           (order1, order2) => order1.Y.CompareTo(order2.Y));

        //Y軸の中央値を得る
        median = buildings[N / 2].Y;
        //Console.Error.WriteLine(median);

        //X軸昇順ソート
        Array.Sort(buildings,
           (order1, order2) => order1.X.CompareTo(order2.X));

        /*
        for (int i = 0; i < N; i++)
        {
            Console.Error.WriteLine("{0} {1}", buildings[i].X, buildings[i].Y);
        }
        */

        //各ビルY軸の中央値からの差を全部足す
        for (int i = 0; i < N; i++)
        {
            int branch = (median - buildings[i].Y);
            branch = branch < 0 ? -branch : branch;
            l += branch;
        }

        //ビルのX方向の全長を足す
        l += (buildings[N - 1].X - buildings[0].X);

        Console.WriteLine(l);
    }

    public class Position
    {
        public int X = 0;
        public int Y = 0;

        public Position(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
    }
}