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
を番兵として、追加します。

後は、順に値を見ていき、
銀を持ってなくて、広義極大値なら銀を入手。
銀を持っていて、広義極小値なら金を入手。
としてます。