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

CODE FESTIVAL 2016予選B B Qualification simulator

■■■問題■■■

CODE FESTIVAL 2016の予選にはN人が参加しました。
参加者は、国内の学生であるか、海外の学生であるか、どちらでもないかのどれかです。

予選は国内または海外の学生のみが通過することができ、
上位の学生から順に、以下の条件を満たすときに通過します。
学生でない参加者は予選を通過できません。

●国内の学生は、現在予選の通過が確定した参加者がA+B人に満たなければ、予選を通過する
●海外の学生は、現在予選の通過が確定した参加者がA+B人に満たず、
  さらに海外の学生の中での順位がB位以内なら、予選を通過する

参加者の情報を表す文字列Sが与えられます。
Sのi文字目がaのとき予選でi位の参加者が国内の学生であることを、
Sのi文字目がbのとき予選でi位の参加者が海外の学生であることを、
Sのi文字目がcのとき予選でi位の参加者がそのどちらでもないことを表しています。

すべての参加者について、
上位から順に、予選を通過した場合はYes、そうでない場合はNoを出力するプログラムを作成してください。

■■■入力■■■

N A B
S

●1 <= N,A,B <= 10万
●A+B <= N
●Sの長さはNである。
●Sは文字aとbとcのみからなる。

■■■出力■■■

N行出力せよ。
i行目には、i位の参加者が予選を通過した場合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("10 2 3");
            WillReturn.Add("abccabaabb");
            //Yes
            //Yes
            //No
            //No
            //Yes
            //Yes
            //Yes
            //No
            //No
            //No
            //1,2,5,6,7位の参加者が予選を通過します
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("12 5 2");
            WillReturn.Add("cabbabaacaba");
            //No
            //Yes
            //Yes
            //Yes
            //Yes
            //No
            //Yes
            //Yes
            //No
            //Yes
            //No
            //No
            //6位の参加者は海外の学生の中で3位なので、予選を通過しません
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("5 2 2");
            WillReturn.Add("ccccc");
            //No
            //No
            //No
            //No
            //No
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

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

        string S = InputList[1];

        int TuukaCnt = 0;
        int KaigaiJyuni = 0;

        for (int I = 0; I <= S.Length - 1; I++) {
            if (S[I] == 'a') {
                if (TuukaCnt < A + B) {
                    TuukaCnt++;
                    Console.WriteLine("Yes");
                }
                else Console.WriteLine("No");
            }
            if (S[I] == 'b') {
                KaigaiJyuni++;
                if (TuukaCnt < A + B && KaigaiJyuni <= B) {
                    TuukaCnt++;
                    Console.WriteLine("Yes");
                }
                else Console.WriteLine("No");
            }

            if (S[I] == 'c') Console.WriteLine("No");
        }
    }
}


解説

ナイーブにシュミレーションしてます。