#include <bits/stdc++.h>
using namespace std; double ret=0; namespace StringUtils {
pair<string,string> split_half(string s,string::size_type p) {
string a="",b="";
for (string::size_type i=0; i<s.size(); i++) {
if (i<p) {
a+=s[i];
}
if (i>p) {
b+=s[i];
}
}
return make_pair(a,b);
}
} map<string,double> che; void initram() {
che[""]=0;
che["H"]=1;
che["C"]=12;
che["N"]=14;
che["O"]=16;
che["F"]=19;
che["Na"]=23;
che["Mg"]=24;
che["Al"]=27;
che["Si"]=28;
che["P"]=31;
che["S"]=32;
che["Cl"]=35.5;
che["K"]=39;
che["Ca"]=40;
che["Mn"]=55;
che["Fe"]=56;
che["Cu"]=64;
che["Zn"]=65;
che["Ag"]=108;
che["I"]=127;
che["Ba"]=137;
che["Hf"]=178.5;
che["Pt"]=195;
che["Au"]=197;
che["Hg"]=201;
} double normal_produce(string s,string::size_type l=0,string::size_type r=0,bool primary=true) {
double res = 0;
string element_buffer = "";
double element_count=1;
string::size_type i=l;
bool least_group=false;
double group_size=0;
if (r==0) {
r=s.length()-1;
}
for (; i<=r; i++) {
if (isupper(s[i])) {
res += (element_count * che[element_buffer]);
res += (group_size * least_group);
element_buffer = "";
element_buffer += s[i];
element_count = 1;
least_group = 0;
} else if (islower(s[i])) {
element_buffer += s[i];
} else if (s[i] == '_' && !least_group) {
element_count = 0;
int j;
for (j=i+1;; j++) {
if (s[j]=='}') {
break;
} else if (isdigit(s[j])) {
element_count = element_count * 10 + (s[j]-'0');
}
}
i=j-1;
} else if (s[i]=='_' && least_group) {
double tv=0;
int j;
for (j=i+1;; j++) {
if (s[j]=='}') {
break;
} else if (isdigit(s[j])) {
tv = tv * 10 + (s[j]-'0');
}
}
res += tv*group_size;
group_size = 0;
least_group = 0;
i=j;
} else if (s[i]=='(') {
res += (che[element_buffer] * element_count);
res += (group_size * least_group);
element_buffer = "";
element_count = 1;
int j;
int rv=0;
for (j=i;;j++) {
if (s[j]=='(') {
rv++;
}
if (s[j]==')') {
rv--;
}
if (rv<=0) {
break;
}
}
group_size=normal_produce(s,i+1,j-1,false);
least_group = 1;
i=j;
}
}
res += (che[element_buffer] * element_count);
res += (group_size * least_group);
if (primary) {
ret += res;
return 0;
} else {
return res;
}
} void hydrate_produce(string s) {
int water_count=0;
int cursor=0;
for (string::size_type i=0; i<s.length(); i++) {
if (isdigit(s[i])) {
cursor++;
water_count=water_count*10+(s[i]-'0');
} else {
break;
}
}
if (cursor == 0) {
water_count = 1;
}
ret += (water_count * 18);
} int main() {
initram();
int spliter=-1145141;
string s;
cin>>s;
for (string::size_type i=0; i<s.length(); i++) {
if (s[i]=='~') {
spliter=i;
break;
}
}
if (spliter<0) {
normal_produce(s);
} else {
pair<string,string> splited = StringUtils::split_half(s,spliter);
normal_produce(splited.first);
hydrate_produce(splited.second);
}
if(ret==(int)(ret)){
cout<<(int)ret;
}
else{
printf("%.1f",ret);
}
return 0;
}

P4711 「化学」相对分子质量 代码的更多相关文章

  1. 【luogu P4711 「化学」相对分子质量】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4711 要细心模拟 #include <cstdio> #include <algorith ...

  2. P4711 「化学」相对分子质量

    P4711 「化学」相对分子质量 给你一个字符串让你输出相对分子质量(弱智字符串模拟) 我比赛tm调了两个半小时啊QAQ 希望以后能增加代码力吧,纪念挂代码 Code #include<iost ...

  3. 【洛谷】【模拟+栈】P4711 「化学」相对分子质量

    [题目传送门:] [戳] (https://www.luogu.org/problemnew/show/P4711) [算法分析:] 关于一个分子拆分后的产物,一共有三种情况: 原子 原子团 水合物 ...

  4. 洛谷 T28312 相对分子质量【2018 6月月赛 T2】 解题报告

    T28312 「化学」相对分子质量 题目描述 做化学题时,小\(F\)总是里算错相对分子质量,这让他非常苦恼. 小\(F\)找到了你,请你来帮他算一算给定物质的相对分子质量. 如果你没有学过相关内容也 ...

  5. 后盾网lavarel视频项目---Laravel 安装代码智能提示扩展「laravel-ide-helper」

    后盾网lavarel视频项目---Laravel 安装代码智能提示扩展「laravel-ide-helper」 一.总结 一句话总结: laravel-ide-helper作用是:代码提示 larav ...

  6. 从0开始学习 GitHub 系列之「04.向GitHub 提交代码」

    之前的这篇文章「从0开始学习 GitHub 系列之「Git速成」」相信大家都已经对 Git 的基本操作熟悉了,但是这篇文章只介绍了对本地 Git 仓库的基本操作,今天我就来介绍下如何跟远程仓库一起协作 ...

  7. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  8. Linux 小知识翻译 - 「模块」

    说起module(模块),有的像「可热插拔的零部件」的意思. 在讨论Linux时提到的模块一般是指可以组装到内核中的模块. 模块这个概念是在硬件和程序设计领域中广泛使用的概念.我们这次说的模块特指Li ...

  9. 「动态规划」-数位dp专题

    数位dp,今天学长讲的稍玄学,课下花了一会时间仔细看了一下,发现板子是挺好理解的,就在这里写一些: 数位dp主要就是搞一些在区间中,区间内的数满足题目中的条件的数的个数的一类题,题目一般都好理解,这时 ...

随机推荐

  1. 2022年最新最详细的tomcat安装教程和常见问的解决

    文章目录 1.官网直接下载 1.1.jdk的版本和tomcat版本应该相对应或者兼容 1.2. 在官网找对应的tomcat版本进行下载 1.3 .根据电脑版本下载64-bit windows zip( ...

  2. Vscode设置标签页多行显示

    1.设置标签页多行展示的方法 文件–>首选项–>设置 2.勾选多行显示按钮 3.显示效果

  3. debian如何删除无效的应用图标

    1.看/usr/share/applications下是否有xxx.desktop 2.可以到-/.local/share/applications下看是否有xxx.desktop 来源:https: ...

  4. vue 项目中不更新的问题

    在项目中 做矩阵题  嵌套的v-for <!-- 多选矩阵题 --> <template v-if="question.name==='MATRIX_CHECKBOX'&q ...

  5. Vue3 企业级优雅实战 - 组件库框架 - 4 组件库的 CSS 架构

    在前一篇文章中分享了搭建组件库的基本开发环境.创建了 foo 组件模块和组件库入口模块,本文分享组件库的样式架构设计. 1 常见的 CSS 架构模式 常见的 CSS 架构模式有很多:OOCSS.ACS ...

  6. Android Studio打开时报错if you already hava 64-bit JDK installed,define a JAVA_HOME

    出现这个问题不知道改了什么导致的,卸载了重新安装也是不行. 以及到高级设置中进行配置jdk也是无效, 解决方法为需要在路径 C:\Users\你自己的用户名\AppData\Roaming\Googl ...

  7. php中的try语句

    为了进一步处理异常,我们需要使用try-catch语句----包括Try语句和至少一个的catch语句.任何调用 可能抛出异常的方法的代码都应该使用try语句.Catch语句用来处理可能抛出的异常.以 ...

  8. c++详细学习——继承

    通常讲父类(parrent)-子类(child).基类(base)-派生类(derived)和超类(super)-子类(sub) 1 最基础的写法 以下例子为最基本的写法,默认构造 1 enum Ge ...

  9. 《HelloGitHub》第 80 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  10. 为什么标准库的模板变量都是inline的

    最近在看标准库里的type_traits的时候发现了个有趣的地方,几乎所有在标准库里的变量模板都是inline的! 不仅常见的实现上(libstdc++.libc++.ms stl)都是inline的 ...