HDOJ 1870 愚人节的礼物 超详细
Problem Description
四月一日快到了,Vayko想了个愚人的好办法——送礼物。嘿嘿,不要想的太好,这礼物可没那么简单,Vayko为了愚人,准备了一堆盒子,其中有一个盒子里面装了礼物。盒子里面可以再放零个或者多个盒子。假设放礼物的盒子里不再放其他盒子。
用()表示一个盒子,B表示礼物,Vayko想让你帮她算出愚人指数,即最少需要拆多少个盒子才能拿到礼物。
Input
本题目包含多组测试,请处理到文件结束。
每组测试包含一个长度不大于1000,只包含'(',')'和'B'三种字符的字符串,代表Vayko设计的礼物透视图。
你可以假设,每个透视图画的都是合法的。
Output
对于每组测试,请在一行里面输出愚人指数。
Sample Input
((((B)()))())
(B)
Sample Output
4
1
根基题意((((B))))这个情况输出4,(((B)))这个情况输出3,不难发现本质上其实就是在数B后面的)的数量。根据这个我们可以简单知道((B))这个情况下输出2就可以了。但我们会发现一个问题如果((((B)())))这个情况下怎么办?如果数了B后面的)的数量的话是5,这个答案显然是不对的。我们得处理中间那个多余的()才行。那我们则可以这么做如果一个(后面紧接这出现)的话我们就直接舍弃这两次输入。这样的话虽然输入是((((B)())))但是其中的()被舍弃了,真正被输入的则是((((B)))),那我们再数B后面的)的话会得到4,显然这个答案是正确的。下面我们用C++代码去实现,代码中利用了栈< stack >,栈是一种先进后出的容器,具体这里就不过多介绍了,大家可以去自行了解一下。
#include<iostream>
#include<stack>
using namespace std;
int main(void)
{
string s;
stack<char>sta;
while (cin >> s)//字符串处理
{
int cut = 0;//每一轮都要初始化一下这个计数器
for (int i = 0; i < s.length(); i++)
if (!sta.empty() && (s[i - 1] == '(' && s[i] == ')'))
sta.pop();/*如果发现(后面紧接着)出现的话舍弃当前输入与上一次输入,
也就是说同时舍弃(和)*/
else
sta.push(s[i]);//不被舍弃的那就存入栈内
while (!sta.empty() && sta.top() != 'B')
{
//统计栈内B之后的)数量
cut++;
sta.pop();//统计完一个)的话删除一个)直到B后面没有)为止
}
while (!sta.empty())
sta.pop();//完成统计最后清空栈,为下一次统计做准备
cout << cut << endl;//输出最后的统计数
}
return 0;
}