AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC169-E Count Median
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("2");
WillReturn.Add("1 2");
WillReturn.Add("2 3");
//3
}
else if (InputPattern == "Input2") {
WillReturn.Add("3");
WillReturn.Add("100 100");
WillReturn.Add("10 10000");
WillReturn.Add("1 1000000000");
//9991
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
struct ABInfoDef
{
internal decimal A;
internal decimal B;
}
static void Main()
{
List<string> InputList = GetInputList();
decimal[] wkArr = { };
Action<string> SplitAct = pStr =>
wkArr = pStr.Split(' ').Select(pX => decimal.Parse(pX)).ToArray();
var ABInfoList = new List<ABInfoDef>();
foreach (string EachStr in InputList.Skip(1)) {
SplitAct(EachStr);
ABInfoDef WillAdd;
WillAdd.A = wkArr[0];
WillAdd.B = wkArr[1];
ABInfoList.Add(WillAdd);
}
int Cnt = ABInfoList.Count;
var MinList = new List<decimal>();
var MaxList = new List<decimal>();
foreach (ABInfoDef EachABInfo in ABInfoList) {
MinList.Add(EachABInfo.A);
MaxList.Add(EachABInfo.B);
}
// 昇順にソートする
MinList.Sort();
MaxList.Sort();
decimal MinMedian;
decimal MaxMedian;
if (Cnt % 2 == 0) {
MinMedian = (MinList[Cnt / 2 - 1] + MinList[Cnt / 2]) / 2;
MaxMedian = (MaxList[Cnt / 2 - 1] + MaxList[Cnt / 2]) / 2;
Console.WriteLine((MaxMedian - MinMedian) / 0.5M + 1);
}
else {
MinMedian = (MinList[Cnt / 2]);
MaxMedian = (MaxList[Cnt / 2]);
Console.WriteLine((MaxMedian - MinMedian) + 1);
}
}
}
解説
オセロセットで考察すると、
要素数が奇数の場合は、
中央値は最小の中央値から最大の中央値までを
1刻みで全て作成可能
要素数が偶数の場合は、
中央値は最小の中央値から最大の中央値までを
0.5刻みで全て作成可能
と分かります。