问题 A: Kick Ass
时间限制: 1 Sec 内存限制: 128 MB提交: 61 解决: 7
题目描述
你玩过一个叫做"Kick Ass - Destroy the web"的游戏吗?如果你想玩的话
当然,你没有玩过也没关系,这个游戏是通过js来加载一个飞船,让你可以通过控制它发射子弹来摧毁网页上的元素,从而获得分数。
我们知道HTML是超文本标记语言,简单地说就是通过一些标签来指明元素的展示方式,比如<p></p>
就可用作表明这是一个段落,<div></div>
表明这是一个区块。
假设有一个网页只含有<p></p>
、<div></div>
两种标记,其中<p><p>
中只含有数字,摧毁<p></p>
标记可获得其中各个数字之和的分数,摧毁<div></div>
可获得其中包含的所有<p></p>
分数与包含的<div></div>
分数二倍之和的分数。
现在给你一个网页,你能否计算出完全摧毁它可得到的分数。
为了简化难度,你可以假设:
- 所给网页的字符只有数字和标签
- 所给网页的标签都正确匹配
- 保证所给网页中的数字都在
<p></p>
标签内 <p></p>
标签内不会含有标签<div></div>
标签内可能含有<p></p>
标签和<div></div>
标签
输入
多组测试数据,请处理到文件结束。
每组占一行,有一个长度不大于1000的字符串代表所给网页。
输出
请输出完全摧毁此网页可获得的分数。
样例输入
<div><p>123</p><div><p>123</p></div></div>
样例输出
18
#include<stdio.h>
#include<string>
#include<stack>
#include<iostream>
using namespace std;//水题,栈
int main()
{
int i,sum,t;
string s;
stack<int>s1;
while(cin>>s)
{
while(!s1.empty())
s1.pop();
t=0;
for(i=0;i<s.size();i++)
{
if(s[i]=='<')//判断是哪种符号
{
sum=0;
if(s[i+1]=='p')//<p>符号开始加
{
for(i=i+3;s[i]!='<';i++)
{
sum+=s[i]-'0';
}
s1.push(sum);//入栈
}
else if(s[i+1]=='/')
{
while(!s1.empty()&&s1.top()!=-1)/</div>符号开始计算
{
sum+=s1.top();
s1.pop();
}
if(!s1.empty())
{
s1.pop();
t--;
}
if(t>0)//如果外边还有-1,要乘2,没有就不乘
s1.push(sum*2);
else
s1.push(sum);
}
else if(s[i+1]=='d')//如果是<div>符号,入-1做标记
{
s1.push(-1);
t++;
}
}
}
sum=0;
while(!s1.empty())
{
sum+=s1.top();
s1.pop();
}
printf("%d\n",sum);
}
}