【hpu1414】Kick Ass

你玩过一个叫做”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; 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章