#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. Linux基础_2_bash功能

    查看当前shell:echo  $SHELL 查看可用shell:cat  /etc/shells 命令行编辑 光标跳到行首:Ctrl+a 光标跳到行尾:Ctrl+e 以单词为单位快速跳转光标:Ctr ...

  2. java中获取当前执行线程的名称

    Thread.currentThread().getName()

  3. 2.Python封装练习及私有属性

    面向对象三大特性 封装:根据职责将属性和方法封装到一个抽象的类中 继承:实现代码的重用,相同代码不需要重复的编写 1.单继承 2.多继承 多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码的 ...

  4. CF Round #829 题解 (Div. 2)

    F 没看所以摆了 . 看拜月教教主 LHQ 在群里代打恰钱 /bx 目录 A. Technical Support (*800) B. Kevin and Permutation (*800) C. ...

  5. Java多线程(7):JUC(上)

    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来- 前面把线程相关的生命周期.关键字.线程池(ThreadPool).ThreadLocal.CAS.锁和AQS都讲完了,现在就剩下怎么来用多线程了 ...

  6. C# 9.0 添加和增强的功能【基础篇】

    一.记录(record) C# 9.0 引入了记录类型. 可使用 record 关键字定义一个引用类型,以最简的方式创建不可变类型.这种类型是线程安全的,不需要进行线程同步,非常适合并行计算的数据共享 ...

  7. Python学习之实例1

    一.求n个数字的平均值 n=3 #定义常量n=3 sum=0 #定义求和变量sum count=0 #定义变量count,记录输入数字的次数 print("请输入3个数字:") # ...

  8. Pthread 并发编程(二)——自底向上深入理解线程

    Pthread 并发编程(二)--自底向上深入理解线程 前言 在本篇文章当中主要给大家介绍线程最基本的组成元素,以及在 pthread 当中给我们提供的一些线程的基本机制,因为很多语言的线程机制就是建 ...

  9. C#自定义控件开发(2)—LED指示灯

    下面来开发一个LED指示灯控件,如下: 设计属性包括: 外环宽度,外环间隙,内环间隙,颜色[五种],当前值. 由于该LED指示灯基本是完全独立设计的,并不是在某个控件的基础上进行的开发,因此,这里使 ...

  10. js/jq 点击按钮显示div,点击页面其他任何地方隐藏div

    1.HTML页面 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" ...