AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC024-B 赤と黒の木
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");
WillReturn.Add("0");
WillReturn.Add("1");
WillReturn.Add("1");
WillReturn.Add("1");
WillReturn.Add("0");
//2
}
else if (InputPattern == "Input2") {
WillReturn.Add("6");
WillReturn.Add("1");
WillReturn.Add("1");
WillReturn.Add("0");
WillReturn.Add("1");
WillReturn.Add("1");
WillReturn.Add("1");
//3
}
else if (InputPattern == "Input3") {
WillReturn.Add("3");
WillReturn.Add("1");
WillReturn.Add("1");
WillReturn.Add("1");
//-1
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] CArr = InputList.Skip(1).Select(pX => int.Parse(pX)).ToArray();
if (CArr.Distinct().Count() == 1) {
Console.WriteLine(-1);
return;
}
var CList = new List<int>();
CList.AddRange(CArr);
CList.AddRange(CArr);
int MaxCnt = 0;
var AppearCList = new List<int>();
foreach (int EachC in CList) {
if (AppearCList.Count > 0 && AppearCList[0] == EachC) {
AppearCList.Add(EachC);
}
else {
AppearCList.Clear();
AppearCList.Add(EachC);
}
MaxCnt = Math.Max(MaxCnt, AppearCList.Count);
}
if (MaxCnt % 2 == 0) {
Console.WriteLine(MaxCnt / 2);
}
else {
Console.WriteLine(MaxCnt / 2 + 1);
}
}
}
解説
赤か黒の1色しかない場合は、
無限に続くので-1を出力します。
赤と黒の2色がある場合は、
環状は扱いにくいので、配列を2つ重ねます。
それから最大の連続数を求めて、
2で割ってから、偶奇で場合分けしてます。