P4711 「化学」相对分子质量 代码
#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 「化学」相对分子质量 代码的更多相关文章
- 【luogu P4711 「化学」相对分子质量】 题解
题目链接:https://www.luogu.org/problemnew/show/P4711 要细心模拟 #include <cstdio> #include <algorith ...
- P4711 「化学」相对分子质量
P4711 「化学」相对分子质量 给你一个字符串让你输出相对分子质量(弱智字符串模拟) 我比赛tm调了两个半小时啊QAQ 希望以后能增加代码力吧,纪念挂代码 Code #include<iost ...
- 【洛谷】【模拟+栈】P4711 「化学」相对分子质量
[题目传送门:] [戳] (https://www.luogu.org/problemnew/show/P4711) [算法分析:] 关于一个分子拆分后的产物,一共有三种情况: 原子 原子团 水合物 ...
- 洛谷 T28312 相对分子质量【2018 6月月赛 T2】 解题报告
T28312 「化学」相对分子质量 题目描述 做化学题时,小\(F\)总是里算错相对分子质量,这让他非常苦恼. 小\(F\)找到了你,请你来帮他算一算给定物质的相对分子质量. 如果你没有学过相关内容也 ...
- 后盾网lavarel视频项目---Laravel 安装代码智能提示扩展「laravel-ide-helper」
后盾网lavarel视频项目---Laravel 安装代码智能提示扩展「laravel-ide-helper」 一.总结 一句话总结: laravel-ide-helper作用是:代码提示 larav ...
- 从0开始学习 GitHub 系列之「04.向GitHub 提交代码」
之前的这篇文章「从0开始学习 GitHub 系列之「Git速成」」相信大家都已经对 Git 的基本操作熟悉了,但是这篇文章只介绍了对本地 Git 仓库的基本操作,今天我就来介绍下如何跟远程仓库一起协作 ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- Linux 小知识翻译 - 「模块」
说起module(模块),有的像「可热插拔的零部件」的意思. 在讨论Linux时提到的模块一般是指可以组装到内核中的模块. 模块这个概念是在硬件和程序设计领域中广泛使用的概念.我们这次说的模块特指Li ...
- 「动态规划」-数位dp专题
数位dp,今天学长讲的稍玄学,课下花了一会时间仔细看了一下,发现板子是挺好理解的,就在这里写一些: 数位dp主要就是搞一些在区间中,区间内的数满足题目中的条件的数的个数的一类题,题目一般都好理解,这时 ...
随机推荐
- iOS开发之自定义日历控件
前言 日常开发中经常会遇到日期选择,为了方便使用,简单封装了一个日历控件,在此抛砖引玉供大家参考. 效果 功能 支持单选.区间 支持默认选中日期 支持限制月份 支持过去.当前.未来模式 支持frame ...
- SQL中的内置函数
IsNull的使用 isnull(name,' ')<>' ' ---如果name为null则就将name转化为' ',然后判断不等于' ', 目的:判断name不等于null ...
- html+css 面试题总结附答案
行内元素有哪些? 块级元素有哪些? 块级元素:div p h1 ul li form table行内元素: a b br i span input select laber strong em img ...
- ubuntu下Mysql安装与root密码重置
一.安装 1.首先更新本地存储库索引,执行sudo apt update 2.从APT存储库安装MySQL,执行sudo apt install MySQL-server,在安装过程中,可能会出现[Y ...
- spalsh安装及简单使用
selenium是浏览器测试自动化工具,很容易完成鼠标点击,翻页等动作,确定是一次只能加载一个页面,无法异步渲染页面,也就限制了selenium爬虫的抓取效率. splash可以实现异步渲染页面,可以 ...
- 关于ASP.NET Core WebSocket实现集群的思考
前言 提到WebSocket相信大家都听说过,它的初衷是为了解决客户端浏览器与服务端进行双向通信,是在单个TCP连接上进行全双工通讯的协议.在没有WebSocket之前只能通过浏览器到服务端的请求应答 ...
- MPC:百万富翁问题
学习文章:"一起学MPC:(一)百万富翁问题"和"[隐私计算笔谈]MPC系列专题(一):安全多方计算应用场景一览" 百万富翁问题 将问题具体化: Alice有\ ...
- YC-Framework版本更新:V1.0.10
分布式微服务框架:YC-Framework版本更新V1.0.10!!! 本文主要内容: 1.V1.0.10版本更新主要内容2.YC-Framework相关系列文章分享 一.V1.0.10版本更新主要内 ...
- C#自定义控件开发(1)
自定义控件可以用组件或者用户控件来开发,如果是基于基础控件,进行一些扩展,那么可以使用组件,其它的情况可以使用用户控件. 首先新建一个类库项目,然后添加一个组件,取名为ButtonExtend,再添加 ...
- vulnhub靶场之VIKINGS: 1
准备: 攻击机:虚拟机kali.本机win10. 靶机:DRIPPING BLUES: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhu ...