hpu1414: Kick Ass [字符串]

传送
1414: Kick Ass [字符串]
时间限制: 1 Sec 内存限制: 128 MB

提交: 117 解决: 35
题目描述

你玩过一个叫做”Kick Ass - Destroy the web”的游戏吗?如果你想玩的话

当然,你没有玩过也没关系,这个游戏是通过js来加载一个飞船,让你可以通过控制它发射子弹来摧毁网页上的元素,从而获得分数。

我们知道HTML是超文本标记语言,简单地说就是通过一些标签来指明元素的展示方式,比如

就可用作表明这是一个段落,
表明这是一个区块。

假设有一个网页只含有

两种标记,其中

中只含有数字,摧毁

标记可获得其中各个数字之和的分数,摧毁
可获得其中包含的所有

分数与包含的
分数二倍之和的分数。

现在给你一个网页,你能否计算出完全摧毁它可得到的分数。

为了简化难度,你可以假设:

所给网页的字符只有数字和标签
所给网页的标签都正确匹配
保证所给网页中的数字都在<p></p>标签内
<p></p>标签内不会含有标签
<div></div>标签内可能含有<p></p>标签和<div></div>标签

输入

多组测试数据,请处理到文件结束。

每组占一行,有一个长度不大于1000的字符串代表所给网页。
输出

请输出完全摧毁此网页可获得的分数。
样例输入

123

123

样例输出

18

分析:题目意思比较简单,很容易相处递归的写法

#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<cstdio>
#include<cstring>
#include<vector>
#define CLR(a,b) memset(a,b,sizeof a)
using namespace std;
typedef long long ll;
char s[1005];
int dfs(int k,int &t,bool f){
    if(f){
        int sum = 0;
        while(true){
            if(s[k]=='<'&&s[k+1]=='p'&&s[k+2]=='>'){
                sum += dfs(k+3,k,false);
            }
            else if(s[k]=='<'&&s[k+1]=='d'&&s[k+2]=='i'){
                sum += 2*dfs(k+5,k,true);
            }
            else if(s[k]=='<'&&s[k+1]=='/'&&s[k+2]=='d'){
                t = k+6;
                return sum;
            }

        }
    }
    else{
        int sum = 0;
        while(true){
            if(s[k]<='9'&&s[k]>='0')
                sum+=s[k]-'0';
            else{
                t = k+4;
                return sum;
            }
            k++;
        }

    }

}

int main(){
    while(~scanf("%s",s)){
        int l = strlen(s);
        int res = 0,i=0;
        while(i<l){
            if(s[i]=='<'&&s[i+1]=='p'&&s[i+2]=='>'){
                res += dfs(i+3,i,false);
            }
            else{
                res += dfs(i+5,i,true);
            }
        }
        printf("%d\n",res);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值