洛谷 T28312 相对分子质量【2018 6月月赛 T2】 解题报告
T28312 「化学」相对分子质量
题目描述
做化学题时,小\(F\)总是里算错相对分子质量,这让他非常苦恼。
小\(F\)找到了你,请你来帮他算一算给定物质的相对分子质量。
如果你没有学过相关内容也没有关系,你可以从样例和提示里理解该题所求内容。
输入输出格式
输入格式:
输入一行,为一个长度为\(L \ (L≤100)\) 的不含空格的字符串,表示给定物质的化学式。
化学式仅包括以下内容:
元素:如\(Au\)(金),\(Hf\)(铪),出现的所有元素及其相对原子质量以附表为准。
下标:\(\_\){} :表示某个原子、离子或者原子团的个数,如 H\(\_\){2}O 表示\(H_2O\) (水),C_{60} 表示$ C_{60}$(足球烯)。
括号 ():表示一个原子团,下标对团内物质生效。如 Ca(OH){2} 表示 \(Ca(OH)_2\) (熟石灰)。
水合物 ~:如 CuSO{4}~5H_{2}O 表示 \(CuSO_4 \cdot 5H_2O\)(胆矾)。水之前如果存在数字,保证一定是大于2的正整数,如果省略该部分则默认为1。如上述胆矾中,表示水的个数的 5。
形式化地讲,你处理的化学式满足以下规则:
分子~数量
其中数量或水合部分可省。
对于分子,满足:
部分_{数量}部分_{数量}...部分_{数量}
其中数量可省。
对于每个“部分”(原子,原子团,离子……),满足:
元素
或
(元素_{ 数量 }元素_{ 数量}... 元素_{数量})
其中数量可省。
请注意,满足上述条件的化学式不会出现括号嵌套;上文中出现的 “数量” 所指代的数字不超过10000 。
输出格式:
输出一行,包含一个整数或者小数部分为 .5 的实数,为你的计算结果。
保证结果不超过 10000 。
月赛的时候胡乱在写,写的非常乱,最后两个点怎么也过不去。想着是自己码力太差,一堆分类讨论自己也乱了。
月赛完了之后回家又写了个函数版的,感觉还算整洁,结果还算过不了。
1个多小时后,我的“Ag”呢·!!它怎么没被打上去呢!!
好吧,这个错误也太诡了,,
奉上感觉相对整洁一点的代码(一样丑)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
using namespace std;
map <string,double > ma;
string s;
int i=0,len;
double num()//返回下标
{
    i+=2;int x=0;
    while(s[i]>='0'&&s[i]<='9')
        x=x*10+s[i++]-'0';
    if(s[i]=='}') i++;
    return x;
}
double get()
{
    string s1=s.substr(i,1);
    string s2=s.substr(i,2);
    if(ma[s2])
    {
        i+=2;
        return ma[s2];
    }
    i++;
    return ma[s1];
}
int main()
{
    ma["H"]=1;ma["C"]=12;ma["N"]=14;ma["O"]=16;ma["F"]=19;
    ma["Na"]=23;ma["Mg"]=24;ma["Al"]=27;ma["Si"]=28;ma["P"]=31;
    ma["S"]=32;ma["Cl"]=35.5;ma["K"]=39;ma["Ca"]=40;ma["Mn"]=55;
    ma["Fe"]=56;ma["Cu"]=64;ma["Zn"]=65;ma["Ag"]=108;ma["I"]=127;
    ma["Ba"]=137;ma["Hf"]=178.5;ma["Pt"]=195;ma["Au"]=197;ma["Hg"]=201;
    cin>>s;
    len=s.size();
    double k=1,ans=0;
    while(i<len)
    {
        if(s[i]=='(')
        {
            double tmp=0.0;
            i++;
            while(s[i]!=')')
            {
                double d=get();
                if(s[i]=='_')
                    d*=num();
                tmp+=d;
            }
            i++;
            if(s[i]=='_')
                tmp*=num();
            ans+=tmp*k;
        }
        else if(s[i]=='~')
        {
            if(s[i+1]<='9'&&s[i+1]>='0')
                i--,k=num();
            else
                i++;
        }
        else
        {
            double d=get()*k;
            if(s[i]=='_')
                d*=num();
            ans+=d;
        }
    }
    if(int(ans*2)%2==1)
        printf("%.1lf\n",ans);
    else
        printf("%d\n",int(ans));
    return 0;
}
2018.6.19
洛谷 T28312 相对分子质量【2018 6月月赛 T2】 解题报告的更多相关文章
- 洛谷1601 A+B Problem(高精) 解题报告
		洛谷1601 A+B Problem(高精) 本题地址:http://www.luogu.org/problem/show?pid=1601 题目背景 无 题目描述 高精度加法,x相当于a+b pro ... 
- 洛谷 P2783 有机化学之神偶尔会做作弊 解题报告
		P2783 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. &quo ... 
- 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告
		P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题意: 给定一个长\(N\)的序列,求满足任意两个相邻元素之间的绝对值之差不超过\(K\)的这个序列的排列有多少个? 范围: ... 
- 洛谷 P1829  [国家集训队]Crash的数字表格 / JZPTAB 解题报告
		[国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ... 
- 洛谷 P4859 已经没有什么好害怕的了 解题报告
		已经没有什么好害怕的了 题目描述 已经使\(\tt{Modoka}\)有签订契约,和自己一起战斗的想法后,\(\tt{Mami}\)忽然感到自己不再是孤单一人了呢. 于是,之前的谨慎的战斗作风也消失了 ... 
- 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告
		P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 题目描述 Those Who Know About Cows are aware of the way cows gr ... 
- 洛谷2019 3月月赛 T2
		题干 洛谷同款 T2?(看似比T1简单些) 二维前缀和嘛?[多简单 我天天拿二维前缀和水DP] 这是前缀和的预处理 2333 处理出来所有的情况 某个地方要加上mod再%mod 如果没有这一步 那么 ... 
- 洛谷P2835 刻录光盘 [2017年6月计划 强连通分量02]
		P2835 刻录光盘 题目描述 在JSOI2005夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习.组委会觉得这个主意不错!可是组委会一时没有足 ... 
- P5239 回忆京都(洛谷3月月赛T2)
		题目描述 射命丸文在取材中发现了一个好玩的东西,叫做组合数. 组合数的定义如下:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合.所有组合的数量,就是组合数 ... 
随机推荐
- 20155330 《网络对抗》 Exp5 MSF基础应用
			20155330 <网络对抗> Exp5 MSF基础应用 实践过程记录 主动攻击实践:MS08_067漏洞攻击 攻击机:kali IP地址:192.168.124.132 靶机:windo ... 
- 汇编 EBP ,ESP 寄存器
			知识点:  CALL框架  EBP寄存器 栈底指针  ESP寄存器 栈顶指针 一.EBP栈底指针 EBP是一个特殊的寄存器,通过EBP+偏移量 可以访问CALL里边的局部变量.它的低16位叫BP ... 
- Scala学习(一)练习
			Scala基础学习&l练习 1. 在Scala REPL中键人3.,然后按Tab键.有哪些方法可以被应用 在Scala REPL中需要按3. 然后按Tab才会提示. 直接按3加Tab是没有提示 ... 
- stl源码剖析 详细学习笔记 set map
			// // set map.cpp // 笔记 // // Created by fam on 15/3/23. // // //---------------------------15/03 ... 
- 《无所不能的JavaScript编程系列:setTimeout 简笔》
			前言:问题引出 JavaScript中会经常用到setTimeout来推迟一个函数的执行,如: setTimeout(function(){alert("Hello World") ... 
- 移动端三合一瀑布流插件(原生JS)
			没有前言,先上DEMO(手机上看效果更佳)和 原码. 瀑布流形式的图片布局方式在手机等移动端设备上运用广泛,比较常见的是下面前两种: 一.等宽等高 这种形式实现起来非常容易,这里就不再多说. 二.等宽 ... 
- leetcode-递增的三元子序列
			给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列. 数学表达式如下: 如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,使得 arr[ ... 
- 11.3  Daily Scrum
			今天的会议上,我们重新规划了一下每个人的分工.大家的安卓开发环境已经配置完毕,于是我们便正式开始进入代码编写的阶段. 由于修改了一下分工,之前发布的任务作废,以新发布的任务为准. Today’s ... 
- Book Review 《构建之法》-2
			-敏捷流程包括了几大原则:Backlog.burn-down.Sprint.Scrum. 敏捷开发注重个人之间的交流,提倡尽早的交付有价值的软件满足顾客的需求, 在开发过程中不断与客户进行交互,变化. ... 
- Ns3 构建哑铃型拓扑,并实现两个点的TCP连接(详细请戳全文)
			aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaUAAADlCAIAAAB8n38hAAAV8UlEQVR4nO3dMWjjyBoH8CkNj1uc5v 
