2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(同步赛) B-分子

2020上海高校程序设计竞赛暨第18届上海大学程序设计联赛夏季赛(同步赛) B-分子

题目描述:
在遥远的斯卡布罗集市,有机分子只能由 C, H, O 三种元素组成。根据珂学家们的探测,一个 C 原子的式量为 13 ,一个 H 原子的式量为 1 ,一个 O 原子的式量为 17 。一个有机分子的式量恰为各个原子的式量的总和。

对于有机分子式给出如下定义:

  • 有机分子式只可能包含数字、括号和 C, H, O 三种元素标记;

  • 数字只能出现在元素标记或右括号的右边,代表该元素(或括号内的分子式)重复出现的次数;

  • 数字只可以是不包含前导零的正整数;

  • 如果一个元素右侧没有数字,那么表示该元素只出现一次;

  • 括号内包含非空的有机分子式,但该有机分子式不再嵌套括号。

例如 (HH)3H(H)、CO2、CH12、CHHOO 都是合法的有机分子式。

而 4HC、CHTHOLLOY、CH3(CH2)3(CH(CHCH3)2CH3)2(CH2)3CH3 都不是合法的有机分子式。

对于符合上述要求的分子式,你能帮助珂学家们计算它的分子式量吗?

输入描述:

输入仅一行,包含一个字符串,代表分子式。
保证符合上述定义,字符串中不含除 C, H ,O,括号和数字以外的字符,且长度不超过 10^15。

输出描述:

在一行中输出一个整数,代表该分子的式量。
保证答案不超过 10^ 15 。

链接:https://ac.nowcoder.com/acm/contest/6871/B
来源:牛客网

示例1
输入

CH3COOH

输出

64

示例2
输入

CH3(CH2)10CH3

输出

182

示例3
输入

H(HH)C(CH2)3O(H)1

输出

79

备注:

斯卡布罗集市是一个魔法集市,所以对化学的定义可能和麻瓜世界略有不同。

在第二个样例中,一共出现了 12 个C和 26 个H;

在第三个样例中出现了 4 个 C、10 个 H 和 1 个 O。

对于部分编程语言,请注意使用合适的数据类型以避免答案溢出。

**
在比赛的时候一直没过,捋不清楚它们的关系,看了别人的代码,终于捋清楚了
可以把整个分子式分块,把后面有数字的和括号括住的拎出来处理
仔细思考可以发现括号中的分子式和外面的处理方式相同
可以利用递归函数一直调用fun()函数对括号中的分子式进行处理

**

#include
using namespace std;
typedef long long ll;
ll lena,i;
char a[100006];
ll max(ll a,ll b)
{
    return a > b ?  a:b;
}
ll fun()
{
    ll ans=0,t = 0;
    for(i; i < lena;i ++)//注意这里从i开始,让i自由变化,不能让i=0
    {
        ll sum = 0;
        while(a[i] >= '0'&&a[i] <= '9')//如果是数字的话,把整个数都算出来
        //(可能是二位数,三位数,多位数)
        {
            sum=sum*10+a[i]-'0';
            i++;
        }
        ans+= t * max(sum,1);//后面没有数字的话就*1,有数字的话就乘以数字
        t = 0;//每轮对t初始化
        if(a[i] == 'C') t = 13;
        else if(a[i] == 'O') t=17;
        else if(a[i] == 'H') t=1;

        if (a[i] == '('){
                i++; //从下一个字符开始
                t=fun();//调用fun函数对括号中的分子式进行计算
            }
        else if(a[i] == ')') break;
        }
        ans+=t; //最后一个如果是字母或者括号括住的分子式,需要再加上去
        return ans;
}
int main()
{
    gets(a);
    lena=strlen(a);
    printf("%lld\n",fun());
    return 0;
}

你可能感兴趣的:(牛客比赛)