AtCoderのARC
次のARCの問題へ
前のARCの問題へ
ARC142-A Reverse and Minimize
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("1420 142");
//3
}
else if (InputPattern == "Input2") {
WillReturn.Add("1419 142");
//2
}
else if (InputPattern == "Input3") {
WillReturn.Add("6 19");
//0
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long[] wkArr = InputList[0].Split(' ').Select(pX => long.Parse(pX)).ToArray();
long N = wkArr[0];
long K = wkArr[1];
var KouhoSet = new HashSet<long>();
Action<long> AddAct = pStaVal =>
{
long CurrVal = pStaVal;
while (CurrVal <= N) {
KouhoSet.Add(CurrVal);
CurrVal *= 10;
}
};
AddAct(K);
AddAct(DeriveRev(K));
long Answer = 0;
foreach (long EachKouho in KouhoSet) {
long Min = DeriveMin(EachKouho);
if (Min == K) Answer++;
}
Console.WriteLine(Answer);
}
// 反転した数を求める
static long DeriveRev(long pVal)
{
string wkStr = pVal.ToString();
string RevStr = new string(wkStr.ToCharArray().Reverse().ToArray());
return long.Parse(RevStr);
}
// 初期値を引数として、最小値を求める
static long DeriveMin(long pStaVal)
{
var VisitedSet = new HashSet<long>();
long CurrVal = pStaVal;
while (true) {
if (VisitedSet.Add(CurrVal) == false) {
break;
}
CurrVal = DeriveRev(CurrVal);
}
return VisitedSet.Min();
}
}
解説
逆の操作を考えると
Kに到達可能な数値は、
Kに0を何個かつけた数か
反転したKに0を何個かつけた数と分かります。
後は、反転操作をシュミレーションすれば良いです。