トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
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);
}
}
解説
ナイーブにシュミレーションしてます。