AtCoderのAGC
次のAGCの問題へ
前のAGCの問題へ
AGC032-A Limited Insertion
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("1 2 1");
//1
//1
//2
}
else if (InputPattern == "Input2") {
WillReturn.Add("2");
WillReturn.Add("2 2");
//-1
}
else if (InputPattern == "Input3") {
WillReturn.Add("9");
WillReturn.Add("1 1 1 2 2 1 2 3 2");
//1
//2
//2
//3
//1
//2
//2
//1
//1
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
int[] BArr = InputList[1].Split(' ').Select(pX => int.Parse(pX)).ToArray();
var AnswerList = new List<int>();
List<int> Blist = BArr.ToList();
while (Blist.Count > 0) {
bool IsMatch = false;
for (int I = Blist.Count - 1; 0 <= I; I--) {
if (Blist[I] == I + 1) {
IsMatch = true;
AnswerList.Add(Blist[I]);
Blist.RemoveAt(I);
break;
}
}
if (IsMatch == false) {
Console.WriteLine(-1);
return;
}
}
AnswerList.Reverse();
AnswerList.ForEach(pX => Console.WriteLine(pX));
}
}
解説
1 1 1 2 2 1 2 3 2
というサンプルで逆から考えます。
最後のInsertは1で、Insert前は
1 1 2 2 1 2 3 2 と分かります。
その前のInsertも1で、Insert前は
1 2 2 1 2 3 2 と分かります。
その前のInsertも1か2が考えられそうですが、
もし、1だとすると、Insert前の文字列は
2 2 1 2 3 2 になって、先頭の2が矛盾して、解になりえないので
Insertされた数値は2と分かり、Insert前は
1 2 1 2 3 2 と分かります。
同様にして、逆順に空文字列までたどっていければ、解あり
逆順に空文字列までたどっていけなければ、解なし
となります。