你玩过一个叫做”Kick Ass - Destroy the web”的游戏吗?如果你想玩的话请点击此处
当然,你没有玩过也没关系,这个游戏是通过js来加载一个飞船,让你可以通过控制它发射子弹来摧毁网页上的元素,从而获得分数。
我们知道HTML是超文本标记语言,简单地说就是通过一些标签来指明元素的展示方式,比如
就可用作表明这是一个段落,表明这是一个区块。假设有一个网页只含有
、两种标记,其中中只含有数字,摧毁
标记可获得其中各个数字之和的分数,摧毁可获得其中包含的所有分数与包含的分数二倍之和的分数。现在给你一个网页,你能否计算出完全摧毁它可得到的分数。
为了简化难度,你可以假设:
所给网页的字符只有数字和标签
所给网页的标签都正确匹配
保证所给网页中的数字都在
标签内不会含有标签 标签内可能含有标签和标签 输入 多组测试数据,请处理到文件结束。 每组占一行,有一个长度不大于1000的字符串代表所给网页。 输出 请输出完全摧毁此网页可获得的分数。 样例输入
123
123
样例输出
18
心理小活动:
/*
强调内容字符串中一开始进行递归时不是div就是p,若是p就直接算中间的数的和然后返回,
只有是div时才会进入if()为真的循环,而且若div是第一次出现那么不会出现里面的值乘二
起初这道题没理解题意,以为只要有数在div和/div之间就成二,
原来是摧毁 < div > < /div > 可获得其中包含的所有 < p >< /p>分数与包含的< div>< /div>分数二倍之和的分数。
所以只有是div出现第二次及以上的时候才会出现数的和乘二
*/
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[1010];
int dfs(int m,int &t,bool flag)
{
if(flag)
{
int sum=0;
while(true)
{
if(str[m]=='<'&&str[m+1]=='p'&&str[m+2]=='>')
sum+=dfs(m+3,m,false);
else if(str[m]=='<'&&str[m+1]=='d'&&str[m+2]=='i')
sum+=2*dfs(m+5,m,true);
else if(str[m]=='<'&&str[m+1]=='/'&&str[m+2]=='d')
{
t=m+6;
return sum;
}
}
}
else
{
int sum=0;
while(true)
{
if(str[m]>='0'&&str[m]<='9')
{
sum+=str[m]-'0';
}
else
{
t=m+4;
return sum;
}
m++;
}
}
}
int main()
{
while(~scanf("%s",str))
{
int l=strlen(str);
int res=0,i=0;
/*
字符串中一开始进行递归时不是div就是p,若是p就直接算中间的数的和然后返回,
只有是div时才会进入if()为真的循环,而且若div是第一次出现那么不会出现里面的值乘二
起初这道题没理解题意,以为只要有数在div和/div之间就成二,
原来是摧毁<div></div>可获得其中包含的所有<p></p>分数与包含的<div></div>分数二倍之和的分数。
所以只有是div出现第二次及以上的时候才会出现数的和乘二
*/
while(i<l)
{
if(str[i]=='<'&&str[i+1]=='p'&&str[i+2]=='>')
res+=dfs(i+3,i,false);
else res+=dfs(i+5,i,true);
}
printf("%d\n",res);
}
return 0;
}