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

ARC-047-A タブの開きすぎ

■■■問題■■■

高橋君はブラウザでネットサーフィンをするのが大好きです。
しかし、タブを開きすぎる癖があるので、よくブラウザがクラッシュします。

高橋君が使っているブラウザは開かれているタブがL個を超えるとクラッシュします。
ブラウザはクラッシュすると自動で再起動して、1個のタブが開いている状態になります。

初め、高橋君のブラウザは1個のタブが開かれている状態です。
そのあとの高橋君の「新しいタブを開く」と「タブを閉じる」の履歴が与えられるので、
高橋君が何回ブラウザをクラッシュさせるかを求めてください。

■■■入力■■■

N L
S

●1行目には高橋君が行った行動の個数を表す整数 N (1 <= N <= 105)と
  ブラウザがクラッシュする基準を表す整数 L (1 <= L <= 10万)が空白区切りで与えられる。
●2行目には高橋君の行動の履歴を表す
  +と-のみからなるN文字の文字列Sが与えられる。
●Sは高橋君の行動を時系列順にならべたものであり、
  +は新しいタブを開くことを、-はあるタブを閉じることを表す。
●タブが1個のときにタブを閉じることは無い。

■■■出力■■■

高橋君がブラウザをクラッシュさせる回数を表す整数を1行に出力せよ。
出力の末尾に改行を入れること。


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("6 2");
            WillReturn.Add("+++-++");
            //2
            //●最初のタブの個数は1個です。
            //●1回目の操作が終わったあとのタブの個数は2個です。
            //●2回目の操作が終わるとタブが3個になりますが
            //  Lより大きいのでブラウザはクラッシュして、タブは1個になります。
            //●3回目の操作が終わったあとのタブの個数は2個です。
            //●4回目の操作が終わったあとのタブの個数は1個です。
            //●5回目の操作が終わったあとのタブの個数は2個です。
            //●6回目の操作が終わるとタブが3個になりますが
            //  Lより大きいのでブラウザはクラッシュして、タブは1個になります。
            //よって合計で2回、ブラウザはクラッシュします。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("20 20");
            WillReturn.Add("++-+-+++--+++++-++++");
            //0
        }
        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 L = wkArr[1];

        string S = InputList[1];

        int Answer = 0;
        int TabCnt = 1;
        foreach (char EachChar in S) {
            if (EachChar == '+') TabCnt++;
            if (EachChar == '-') TabCnt--;

            if (TabCnt > L) {
                Answer++;
                TabCnt = 1;
            }
        }
        Console.WriteLine(Answer);
    }
}


解説

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