zoukankan      html  css  js  c++  java
  • P2382 化学分子式

    题目

    模拟

    1、遇到'(',我们就把栈的层数+1,以便出栈时累计

    2、遇到字母后,判断下一位是否是小写字母,将其在map中的值取出加入栈中,再将最近一次的元素保存(暂记作key),等会有用^_^,别忘了判断UNKNOWN。

    3、遇到数字,while循环取出它(记作x),说明上次的key有了用武之地,在栈中加入(x - 1)倍的key元素质量,因为上一次加了一份嘛

    4、若遇到')',我们考虑直接取出后面的数字(还是x),然后将本层栈中答案乘上x,加入上一层栈中并清空这一层。

    完结撒花!

    #include<bits/stdc++.h>
    using namespace std;
    map<string,int> a;
    string s,ss;
    int x,top,b[100005];
    int main() {
        cin>>s;
        while (s!="END_OF_FIRST_PART") {
            cin>>x;
            a[s]=x;
            cin>>s;
        }
        cin>>s;
        while (s!="0") {
            int fl=1;
            memset(b,0,sizeof(b));
            s=' '+s;
            top=0;
            for (int i=1; i<=s.length(); i++) {
                if (s[i]>='A' && s[i]<='Z') {
                    if (s[i+1]>='a' && s[i+1]<='z') {
                        ss=s.substr(i,2);
                        i++;
                    } else ss=s.substr(i,1);
                    if (!a[ss]) {
                        printf("UNKNOWN
    ");
                        fl=0;
                        break;
                    } else b[top]+=a[ss];
                }
                if (s[i]>='0' && s[i]<='9') {
                    x=0;
                    while (s[i]>='0' && s[i]<='9') {
                        x=x*10+s[i]-'0';
                        i++;
                    }
                    i--;
                    b[top]+=(x-1)*a[ss];
                }
                if (s[i]=='(') top++;
                if (s[i]==')') {
                    i++,x=0;
                    while (s[i]>='0' && s[i]<='9') {
                        x=x*10+s[i]-'0';
                        i++;
                    }
                    b[--top]+=x*b[top+1];
                    b[top+1]=0;
                    i--;
                }
            }
            if (fl) printf("%d
    ",b[0]);
            cin>>s;
    
        }
    
        return 0;
    }
  • 相关阅读:
    @media screen响应式
    gulp轻松上手
    Node.js基本讲解
    百度地图
    SQL语言(增删改查)
    AJAX基本介绍(web前端)
    找出链表的第一个公共节点
    微软算法100题58 从尾到头输出链表(java)
    最长递增子序列
    各种排序算法
  • 原文地址:https://www.cnblogs.com/zzrblogs/p/12201861.html
Copyright © 2011-2022 走看看