#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. Vue学习之--------深入理解Vuex之模块化编码(2022/9/4)

    在以下文章的基础上 1.深入理解Vuex.原理详解.实战应用:https://blog.csdn.net/weixin_43304253/article/details/126651368 2.深入理 ...

  2. 齐博x1万能数据统计接口

    为何叫万能数据统计接口呢?因为可以调用全站任何数据表的数据总条数,并且可以设置查询条件http://qb.net/index.php/index/wxapp.count.html?table=memb ...

  3. PaddleOCR-EAST

    目录 EAST Abstract Train PreProcess Architecture Backbone Neck Head Loss Dice Loss SmoothL1 Loss Infer ...

  4. 畸变矫正、透视变换加速(OpenCV C++)

    前两周,同事和我说检测时间超时,其中对图像做畸变矫正和投影变换就要花费25ms(3000×3000的图).而此时我们已经用上了文章opencv图像畸变矫正加速.透视变换加速方法总结中的方法.突然我想到 ...

  5. 一篇了解全MVCC

    一.什么是MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制,是一种并发控制的方法,一般用在数据库管理系统中,实现对数据库的并发访问,比如在M ...

  6. linux清理内存缓存cache

    Linux服务器有自己先进的内存管理机制,有时候会发现我们系统的buff/cache内存占用会越来越高,操作系统也有卡顿的情况,遇到这种情况,不妨试试下面的方法. 1步骤一:我们先查看物理内存占用情况 ...

  7. 学习ASP.NET Core Blazor编程系列九——服务器端校验

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  8. springboot集成支付宝的支付(通用版)

    [1.引依赖] <dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sd ...

  9. 阿里云 ACK 接入观测云

    简介 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理.2021 年成为国内唯一连续三年入选 Gartner 公共云容器报告的 ...

  10. 关于 .NET 在不同操作系统中 IO 文件路径拼接方法结升级 .NET 7 后注意到的一个小坑

    .NET 现在支持跨平台这件事情已经是众所周知的特点了,虽然平台整体支持跨平台了,但是我们的代码如果真的想要实现跨平台运行其实还是有些小细节要注意的,今天想要记录分享的就是关于 文件I/O操作时路径的 ...