AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC173-D Chat in a Circle
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 2 1 3");
//7
}
else if (InputPattern == "Input2") {
WillReturn.Add("7");
WillReturn.Add("1 1 1 1 1 1 1");
//6
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] AArr = InputList[1].Split(' ').Select(pX => int.Parse(pX)).ToArray();
Array.Sort(AArr, (A, B) => B.CompareTo(A));
long Answer = 0;
long AddCnt = AArr.Length - 1;
for (int I = 0; I <= AArr.GetUpperBound(0); I++) {
if (AddCnt == 0) break;
if (I == 0) {
Answer += AArr[I];
AddCnt--;
}
else {
Answer += AArr[I];
AddCnt--;
if (AddCnt > 0) {
Answer += AArr[I];
AddCnt--;
}
}
}
Console.WriteLine(Answer);
}
}
解説
直感的に降順に配置しても問題なさそうだと分かります。
円状だと考えにくいので
直線状で8 7 6 5 4 3 2 1を
配置すると考えます。
8 8
7
6 5
4 3 2 1
上記のように2分木で配置していけば、
最大値の8は1回しか得点に計上できなくて、
残りの数は2回ずつ計上できるので
これらの合計が解になります。