AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC361-C Make Them Narrow
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("5 2");
WillReturn.Add("3 1 5 4 9");
//2
}
else if (InputPattern == "Input2") {
WillReturn.Add("6 5");
WillReturn.Add("1 1 1 1 1 1");
//0
}
else if (InputPattern == "Input3") {
WillReturn.Add("8 3");
WillReturn.Add("31 43 26 6 18 36 22 13");
//18
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long[] wkArr = InputList[0].Split(' ').Select(pX => long.Parse(pX)).ToArray();
long K = wkArr[1];
long[] AArr = InputList[1].Split(' ').Select(pX => long.Parse(pX)).ToArray();
Array.Sort(AArr);
long UB = AArr.GetUpperBound(0);
long RestCnt = AArr.Length - K;
var AnswerKouho = new List<long>();
for (long I = 0; I <= UB; I++) {
long IndSta = I;
long IndEnd = I + RestCnt - 1;
if (IndEnd > UB) break;
long MaxVal = AArr[IndEnd];
long MinVal = AArr[IndSta];
AnswerKouho.Add(MaxVal - MinVal);
}
Console.WriteLine(AnswerKouho.Min());
}
}
解説
3 1 4 1 5 9 2 6 5 3 5
で考えると、
ソートしても問題ないのでソートします。
1 1 2 3 3 4 5 5 5 6 9
残す集合の要素数は、決まってますが、
連続した区間で残すのが最適です。
あとは、連続した区間を全探索すれば良いです。