AtCoderのABC    次のABCの問題へ    前のABCの問題へ

ABC094-C Many Medians


問題へのリンク


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("4");
            WillReturn.Add("2 4 4 3");
            //4
            //3
            //3
            //4
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("2");
            WillReturn.Add("1 2");
            //2
            //1
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("6");
            WillReturn.Add("5 5 4 4 3 3");
            //4
            //4
            //4
            //4
            //4
            //4
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();

        int[] XArr = InputList[1].Split(' ').Select(pX => int.Parse(pX)).ToArray();
        int UB = XArr.GetUpperBound(0);

        int[] SortedArr = XArr.OrderBy(pX => pX).ToArray();

        // 中央値[削除する値]なDict
        var MedianDict = new Dictionary<int, int>();
        for (int I = 0; I <= UB; I++) {
            if (I <= UB / 2) {
                int Median1 = SortedArr[UB / 2 + 1];
                MedianDict[SortedArr[I]] = Median1;
            }
            else {
                int Median2 = SortedArr[UB / 2];
                MedianDict[SortedArr[I]] = Median2;
            }
        }

        for (int I = 0; I <= UB; I++) {
            Console.WriteLine(MedianDict[XArr[I]]);
        }
    }
}


解説

X0 X1 X2 X3 X4 X5
といったソートされた配列がある場合

X0からX2のどれか1つを除外したときの中央値は、X3
X3からX5のどれか1つを除外したときの中央値は、X2
なので、除外した値ごとの中央値を、Dictionaryに設定してます。