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. python基础4之递归、lambda、深浅copy

    内容概要: 一.递归 二.匿名函数 三.关于python中的深浅拷贝与赋值 一.递归 递归就是函数本身调用自己,直到满足指定条件之后一层层退出函数 递归特性: 必须有一个明确的结束条件 每次进入更深一 ...

  2. 2017-2018-2 20155203《网络对抗技术》Exp6 信息搜集与漏洞扫描

    1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法. 2.实践内容 (1)各种搜索技巧的应用 通过搜索引擎进行信息搜集敏感信息 在百度搜索栏中输入filetype:关键字 site:edu.c ...

  3. 20155216 Exp3 免杀原理与实践

    Exp3 免杀原理与实践 基于特征码的改变来实现免杀(实践过程记录) MSF编码器编译后门检测 可以通过VirSCAN来检验后门抗杀能力. ps:选择后门前修改其文件名,不得含有数字. 如上图所示,3 ...

  4. C标准库string.h中几个常用函数的使用详解

    strlen 计算字符串长度 size_t strlen(const char *str) 计算字符串 str 的长度,直到空结束字符,但不包括空结束字符. 函数实现: int Strlen(cons ...

  5. Vue.js动态组件

    动态组件: 1.定义: 几个组件放在同一个挂载点下,然后根据父组件的某个变量来决定显示哪个,或者都不显示. 2.动态切换原理: 在挂载点使用<component>标签,然后使用v-bind ...

  6. Partition4:增加分区

    在关系型 DB中,分区表经常使用DateKey(int 数据类型)作为Partition Column,每个月的数据填充到同一个Partition中,由于在Fore-End呈现的报表大多数是基于Mon ...

  7. JQuery快速入门-事件与效果

    一.事件 事件绑定的方法有两种: 绑定到元素 查找元素后绑定事件 方法1:绑定到元素 <body> <p onclick='func1()'>点击我</p> < ...

  8. css修改select下拉列表的默认样式

    select的一些默认样式我们很难修改,比如图标的替换.接下来就说说如何修改这些默认样式: html代码: <div> <select name=""> & ...

  9. docker 部署Spring Boot:Docker化Spring Boot应用程序

    第一章 1.创建项目存放目录 mkdir /root/sproot -p 2.准备好Spring Boot应用程序 jar 包 testrest.jar 第二章 1. 安装docker 在所有节点执行 ...

  10. 关于Java开发一职的经验

    本人为大四软件工程学生,由于准备不充分也没有前人指点,去年10月份才赶上秋招节奏,然后签下了一家比较起来还行的公司.所以不太期望大家有求职意愿但苦于不知作何准备,所以特列以下知识点检索供大家查阅.如果 ...