多校联萌第三场 问题 A: Kick Ass

问题 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);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值