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

ABC-005-C おいしいたこ焼きの売り方

■■■問題■■■

高橋君は、たこ焼きをどの順番で売るか悩んでいました。
というのも、作り置きされたたこ焼きは美味しくないとわかっているので、
高橋君はそのようなたこ焼きを売りたくないのですが、
できたてばかり売ってしまうと売れるたこ焼きの数が減ってしまいます。 

また、お客さんを待たせてばかりだと、
次第にお客さんが離れてしまうだろうと高橋君は考えています。
そこで、彼はT秒以内に作成されたたこ焼きを売り続けることで、
お客さんを捌ききれるかどうかを調べることにしました。

たこ焼きは A1、A2、 ・・・ 、AN 秒後に焼きあがります。
お客さんは B1、B2、 ・・・ 、BM 秒後にやってきます。

1人のお客さんに対して、たこ焼きを1つ売るとします。
すべてのお客さんにたこ焼きを売れるなら'yes'、
売れないなら'no'を出力して下さい。 

■■■入力■■■

T
N
A1 A2 ・・・ AN
M
B1 B2 ・・・ BM

1行目に、何秒以内のたこ焼きまで売るかを表す整数T(1 <= T <= 100)が与えられます。
2行目に、高橋君が作成するたこ焼きの総数を表す整数N(1 <= N <= 100)が与えられます。
3行目に、それぞれのたこ焼きが何秒後にできるかを表す整数
         Ai(1 <= Ai <= 100、A1 <= A2 <= … <= AN)
         が半角スペース区切りでN個与えられます。
4行目に、来店するお客さんの人数を表す整数M(1 <= M <= 100)が与えられます。
5行目に、それぞれのお客さんが何秒後に来るかを表す整数
         Bi(1 <= Bi <= 100、B1 <= B2 <= … <= BM)
         が半角スペース区切りでM個与えられます。

■■■出力■■■

すべてのお客さんにたこ焼きをすぐ売れるなら'yes'、
売れないなら'no'を出力して下さい。


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("1");
            WillReturn.Add("3");
            WillReturn.Add("1 2 3");
            WillReturn.Add("3");
            WillReturn.Add("2 3 4");
            //yes
            //それぞれのお客さんに1秒前にできたたこ焼きを売ると、
            //すべてのお客さんにたこ焼きを売ることができます。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("1");
            WillReturn.Add("3");
            WillReturn.Add("1 2 3");
            WillReturn.Add("3");
            WillReturn.Add("2 3 5");
            //no
            //最後のお客さんにたこ焼きを売ることができません
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("1");
            WillReturn.Add("3");
            WillReturn.Add("1 2 3");
            WillReturn.Add("10");
            WillReturn.Add("1 2 3 4 5 6 7 8 9 10");
            //no
            //高橋くんのたこ焼き屋は大人気です
        }
        else if (InputPattern == "Input4") {
            WillReturn.Add("1");
            WillReturn.Add("3");
            WillReturn.Add("1 2 3");
            WillReturn.Add("3");
            WillReturn.Add("1 2 2");
            //no
            //3人目のお客さんを待たせてしまいます
        }
        else if (InputPattern == "Input5") {
            WillReturn.Add("2");
            WillReturn.Add("5");
            WillReturn.Add("1 3 6 10 15");
            WillReturn.Add("3");
            WillReturn.Add("4 8 16");
            //yes
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        int T = int.Parse(InputList[0]);

        int[] AArr = InputList[2].Split(' ').Select(X => int.Parse(X)).ToArray();
        int[] BArr = InputList[4].Split(' ').Select(X => int.Parse(X)).ToArray();

        if (IsYES(T, AArr, BArr)) Console.WriteLine("yes");
        else Console.WriteLine("no");
    }

    //yesを出力するかを判定
    static bool IsYES(int pT, int[] pAArr, int[] pBArr)
    {
        int UB_A = pAArr.GetUpperBound(0);
        int UB_B = pBArr.GetUpperBound(0);
        int IndA = 0;

        for (int I = 0; I <= UB_B; I++) {
            while (true) {
                //売るたこやきがない場合
                if (IndA > UB_A) return false;

                //期間がOverLapしてれば売れる
                if (pAArr[IndA] <= pBArr[I] && pBArr[I] <= pAArr[IndA] + pT) {
                    IndA++;
                    break;
                }
                IndA++;
            }
        }
        return true;
    }
}


解説

お客さんの待ち行列をベースにしてループさせてます。