AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC128-A Gold and Silver
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("3");
WillReturn.Add("3 5 2");
//0 1 1
}
else if (InputPattern == "Input2") {
WillReturn.Add("4");
WillReturn.Add("1 1 1 1");
//0 0 0 0
}
else if (InputPattern == "Input3") {
WillReturn.Add("10");
WillReturn.Add("426877385 186049196 624834740 836880476 19698398 709113743 436942115 436942115 436942115 503843678");
//1 1 0 1 1 1 1 0 0 0
}
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();
var AList = new List<int>();
AList.Add(int.MinValue);
AList.AddRange(AArr);
AList.Add(int.MaxValue);
int UB = AList.Count - 1;
bool HasSilver = false;
var AnswerList = new List<int>();
for (int I = 0; I <= UB; I++) {
if (I == 0 || I == UB) continue;
// 極大かの判定
bool IsKyokudai = false;
if (AList[I - 1] <= AList[I] && AList[I] >= AList[I + 1]) {
IsKyokudai = true;
}
// 極小かの判定
bool IsKyokusyou = false;
if (AList[I - 1] >= AList[I] && AList[I] <= AList[I + 1]) {
IsKyokusyou = true;
}
if (HasSilver == false && IsKyokudai) {
AnswerList.Add(1);
HasSilver = true;
}
else if (HasSilver && IsKyokusyou) {
AnswerList.Add(1);
HasSilver = false;
}
else {
AnswerList.Add(0);
}
}
string[] AnswerArr = Array.ConvertAll(AnswerList.ToArray(), pX => pX.ToString());
Console.WriteLine(string.Join(" ", AnswerArr));
}
}
解説
先頭にint.MinValue
末尾にint.MaxValue
を番兵として、追加します。
後は、順に値を見ていき、
銀を持ってなくて、広義極大値なら銀を入手。
銀を持っていて、広義極小値なら金を入手。
としてます。