トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
AGC-016-A Shrinking
■■■問題■■■
すぬけ君は、次のルールに従い、
長さNの文字列tを長さ N-1 の文字列t'へ変えることができます。
●各i (1 <= i <= N-1) について、
t' のi文字目はtのi, i+1 文字目のどちらかである。
英小文字のみからなる文字列sがあります。
すぬけ君の目標は、sに上記の操作を繰り返し行い、
sが単一の文字のみからなるようにすることです。
目標を達成するために必要な操作回数の最小値を求めてください。
■■■入力■■■
s
●1 <= |s| <= 100
●sは英小文字のみからなる
■■■出力■■■
目標を達成するために必要な操作回数の最小値を出力せよ。
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("serval");
//3
//例えば、serval → srvvl → svvv → vvv と変えればよいです
}
else if (InputPattern == "Input2") {
WillReturn.Add("jackal");
//2
//例えば、jackal → aacaa → aaaa と変えればよいです
}
else if (InputPattern == "Input3") {
WillReturn.Add("zzz");
//0
//最初からsが単一の文字のみからなっています
}
else if (InputPattern == "Input4") {
WillReturn.Add("whbrjpjyhsrywlqjxdbrbaomnw");
//8
//8回の操作によって、sをrrrrrrrrrrrrrrrrrrへ変えることができます
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static string ms;
static void Main()
{
List<string> InputList = GetInputList();
ms = InputList[0];
//最終文字の候補
char[] KouhoArr = ms.Distinct().ToArray();
int Answer = int.MaxValue;
foreach (char EachKouho in KouhoArr) {
int wkTesuu = DeriveTesuu(EachKouho);
if (Answer > wkTesuu)
Answer = wkTesuu;
}
Console.WriteLine(Answer);
}
//最後の文字を引数として、必要な手数を返す
static int DeriveTesuu(char pKouho)
{
int WillReturn = 0;
string CurrStr = ms;
while (true) {
if (CurrStr.Distinct().Count() == 1) {
return WillReturn;
}
var sb = new System.Text.StringBuilder();
for (int I = 0; I <= CurrStr.Length - 2; I++) {
if (CurrStr[I] == pKouho || CurrStr[I + 1] == pKouho) {
sb.Append(pKouho);
}
else sb.Append(CurrStr[I]);
}
WillReturn++;
CurrStr = sb.ToString();
}
}
}
解説
最後に残る文字ごとに、最小の手数を求めてます。