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】 解题报告的更多相关文章

  1. 洛谷1601 A+B Problem(高精) 解题报告

    洛谷1601 A+B Problem(高精) 本题地址:http://www.luogu.org/problem/show?pid=1601 题目背景 无 题目描述 高精度加法,x相当于a+b pro ...

  2. 洛谷 P2783 有机化学之神偶尔会做作弊 解题报告

    P2783 有机化学之神偶尔会做作弊 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 有一天他一边搓炉石一边监考,而你作为一个信息竞赛的大神也来凑热闹. 然而你的化竞基友却向你求助了. &quo ...

  3. 洛谷 P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 解题报告

    P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows 题意: 给定一个长\(N\)的序列,求满足任意两个相邻元素之间的绝对值之差不超过\(K\)的这个序列的排列有多少个? 范围: ...

  4. 洛谷 P1829 [国家集训队]Crash的数字表格 / JZPTAB 解题报告

    [国家集训队]Crash的数字表格 / JZPTAB 题意 求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\),\(n,m\le 10^7\) 鉴于 ...

  5. 洛谷 P4859 已经没有什么好害怕的了 解题报告

    已经没有什么好害怕的了 题目描述 已经使\(\tt{Modoka}\)有签订契约,和自己一起战斗的想法后,\(\tt{Mami}\)忽然感到自己不再是孤单一人了呢. 于是,之前的谨慎的战斗作风也消失了 ...

  6. 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告

    P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 题目描述 Those Who Know About Cows are aware of the way cows gr ...

  7. 洛谷2019 3月月赛 T2

    题干 洛谷同款 T2?(看似比T1简单些) 二维前缀和嘛?[多简单 我天天拿二维前缀和水DP] 这是前缀和的预处理 2333 处理出来所有的情况 某个地方要加上mod再%mod 如果没有这一步 那么 ...

  8. 洛谷P2835 刻录光盘 [2017年6月计划 强连通分量02]

    P2835 刻录光盘 题目描述 在JSOI2005夏令营快要结束的时候,很多营员提出来要把整个夏令营期间的资料刻录成一张光盘给大家,以便大家回去后继续学习.组委会觉得这个主意不错!可是组委会一时没有足 ...

  9. P5239 回忆京都(洛谷3月月赛T2)

    题目描述 射命丸文在取材中发现了一个好玩的东西,叫做组合数. 组合数的定义如下:从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合.所有组合的数量,就是组合数 ...

随机推荐

  1. MapReduce -- 最短路径

    示例: 给出各个节点到相邻节点的距离,要求算出初始节点到各个节点的最短路径. 数据: A (B,) (D,) B (C,) (D,) C (E,) D (B,) (C,) (E,) E (A,) (C ...

  2. WPF之Manipulation

    原文:WPF之Manipulation 需求:现,在窗口下有一个StackPanel控件. 1.可以拖动. 2.可以展开及收缩(不仅仅可以拖动还可以点击) 3.窗口向坐标轴一样分四个象限,在不同的区域 ...

  3. python 回溯法 子集树模板 系列 —— 16、爬楼梯

    问题 某楼梯有n层台阶,每步只能走1级台阶,或2级台阶.从下向上爬楼梯,有多少种爬法? 分析 这个问题之前用分治法解决过.但是,这里我要用回溯法子集树模板解决它. 祭出元素-状态空间分析大法:每一步是 ...

  4. HNOI2019 摸鱼记

    感觉准备省选时有点浮躁,没有准备联赛时那样认真, 希望能将这次省选当做一个教训吧QAQ. Day -inf 基本上把要学的东西都学了,至少做到了自己心里有底. Day 0 乒乓球室没开差评,打隔膜不带 ...

  5. Linux每天一个命令:cat

    Linux cat命令 命令:cat cat 命令用于连接文件并打印到标准输出设备上. 使用权限 所有使用者 语法格式 cat [-AbeEnstTuv] [--help] [--version] f ...

  6. Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries

    目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...

  7. 软件工程第二次作业(JUnit的使用)

    初次使用JUnit 感谢学习资源Junit使用的超简单介绍源 一.开发环境及界面截图: 系统   Windows 10      编辑器       eclipse         语言        ...

  8. linux/Centos下查看和修改网卡Mac地址(ifconfig命令)

    本文转载自http://www.169it.com/article/14360294838474691537.html linux/Centos下查看网卡Mac地址,输入命令: #ifconfig - ...

  9. RyuBook1.0案例二:Traffic Monitor项目源码分析

    Traffic Monitor源码分析 从simple_switch_13.SimpleSwitch13控制器继承并开发 class SimpleMonitor13(simple_switch_13. ...

  10. CentOS 7 Apache服务的安装与配置

    原文出处:http://blog.51cto.com/13525470/2070375 一.Apache简介 Apache 是一个知名的开源Web服务器.早期的Apache服务器由Apache Gro ...