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に設定してます。