列表

详情


NC219040. 相对分子质量

描述

给出单个原子的相对原子质量,计算化学式的相对分子质量。

输入描述

第一行中给出两个正整数

接下来M行每行给出一个以大写字母开头的字符串S和一个正整数X,S为元素名称,X为相对原子质量,

最后N行每行给出一个化学式,保证化学式长度不超过50个字符

元素可能是一个大写字母,也可能是一个大写字母跟着一个小写字母,保证给出的M种化学元素互不相同

化学式包含括号以及括号嵌套,例如:Ba((OH)2(CO3)2)3

注:保证化学式使用给出的元素符号,但不保证该物质真实存在


输出描述

输出N行,每行一个相对分子质量,数据保证相对分子质量在long long范围内

示例1

输入:

2 2
H 1
O 16
H2
H2O

输出:

2
18

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 4ms, 内存消耗: 296K, 提交时间: 2022-04-22 12:42:04

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<string,ll>mp;
stack<ll>st;
int main()
{
	ll n,m,k;
	string s;
	cin>>m>>n;
	for(ll i=1;i<=m;i++)
	{
		cin>>s>>k;
		mp[s]=k;
	}
	while(n--)
	{
		cin>>s;
		ll n=s.size();
		string t;
		for(ll i=0;i<n;i++)
		{
			if(s[i]=='(')st.push(-1);
			else if(s[i]==')')
			{
				ll x=0;
				while(st.top()!=-1)x+=st.top(),st.pop();
				st.pop();
				st.push(x);
			}
			else if(s[i]>='0'&&s[i]<='9')
			{
				ll x=0;
				bool fff=0;
				while(s[i]>='0'&&s[i]<='9')x=x*10+s[i++]-'0',fff=1;
				ll y=st.top();
				st.pop();
				st.push(y*x);
				i-=fff;
			}
			else
			{
				t=s[i];
				i++;
				while(islower(s[i])&&i<n)t+=s[i++];
				i--;
				st.push(mp[t]);
			}
		}
		ll x=0;
		while(st.size())x+=st.top(),st.pop();
		cout<<x<<'\n';
	}
    return 0;
}

pypy3 解法, 执行用时: 83ms, 内存消耗: 25884K, 提交时间: 2021-09-21 14:15:27

m, n = map(int, input().split())
dic = {}
for i in range(m):
    key, val = input().split()
    dic[key] = val

for i in range(n):
    s = input()
    ss = ""
    j = 0
    while j < len(s):
        if j != len(s) - 1 and s[j:j + 2] in dic:
            ss += dic[s[j:j + 2]]
            ss += '+'
            j += 1
        elif s[j] in dic:
            ss += dic[s[j]]
            ss += '+'
        elif s[j].isdigit():
            ss += '*'

            while j < len(s) and s[j].isdigit():
                ss += s[j]
                j += 1
            ss += '+'
            continue
        else:
            ss += s[j]
        j += 1
    
    ss = ss.replace("+*", "*")
    ss = ss.replace("*)", ")")
    ss = ss.replace("+)", ")")
    if ss[-1] == '+':
        ss = ss[:-1]

    print(eval(ss))

Python3(3.9) 解法, 执行用时: 17ms, 内存消耗: 2808K, 提交时间: 2021-03-22 17:25:44

m, n = map(int, input().split())
dic = {}
for i in range(m):
    key, val = input().split()
    dic[key] = val
for i in range(n):
    s = input()
    st = ""
    j = 0
    while j < len(s):
        if j != len(s)-1 and s[j:j+2] in dic:
            st += dic[s[j:j+2]]
            st += '+'
            j += 1
        elif s[j] in dic:
            st += dic[s[j]]
            st += '+'
        elif s[j].isdigit():
            st += '*'
            while j < len(s) and s[j].isdigit():
                st += s[j]
                j += 1
            st += '+'
            continue
        else:
            st += s[j]
        j += 1
    st = st.replace("+*", "*")
    st = st.replace("*)", ")")
    st = st.replace("+)", ")")
    if st[-1] == '+':
        st = st[:-1]
    print(eval(st))

上一题