トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

ABC-042-C こだわり者いろはちゃん

■■■問題■■■

いろはちゃんはこだわりもので、嫌いな数字がK個あり、それぞれ D1,D2,・・・,DK です。

いろはちゃんはお店でお買い物をしていて、
N円の品物を買おうとしています。
もちろん、この品物はN円以上のお金を支払えば買うことができます。

しかし、先ほど述べたように
いろはちゃんは強いこだわりがあるので、
自分がお店に支払う金額の10進表記に
いろはちゃんの嫌いな数字が出現しないような最も少ない金額を支払おうとします。

いろはちゃんが支払う金額を求めてください。

■■■入力■■■

N K
D1 D2 ・・・ DK

●1 <= N < 10000
●1 <= K < 10
●0 <= D1 < D2 < ・・・ < DK < = 9
●{D1,D2,…,DK}≠{1,2,3,4,5,6,7,8,9}

■■■出力■■■

いろはちゃんが支払う金額を出力せよ。


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("1000 8");
            WillReturn.Add("1 3 4 5 6 7 8 9");
            //2000
            //嫌いでない数字は0と2のみです。
            //N=1000以上の整数で、
            //桁に0と2のみが含まれる最小の整数は2000なのでそれを出力してください。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("9999 1");
            WillReturn.Add("0");
            //9999
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int N = int.Parse(InputList[0].Split(' ')[0]);
        int[] DArr = InputList[1].Split(' ').Select(X => int.Parse(X)).ToArray();

        for (int I = N; I < int.MaxValue; I++) {
            HashSet<int> NumSet = DeriveNumSet(I);
            if (NumSet.Overlaps(DArr) == false) {
                Console.WriteLine(I);
                break;
            }
        }
    }

    static HashSet<int> DeriveNumSet(int pVal)
    {
        var WillReturn = new HashSet<int>();
        do {
            int ModVal = pVal % 10;
            WillReturn.Add(ModVal);
            pVal /= 10;
        } while (pVal > 0);
        return WillReturn;
    }
}


解説

制約が緩いので、Nから順に全探索してます。