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主要就是搞一些在区间中,区间内的数满足题目中的条件的数的个数的一类题,题目一般都好理解,这时 ...
随机推荐
- Apple Low Power DisplayPort(ALP_DP)学习随笔
edp是PC内置显示接口的主流标准,主用于笔记本电脑或PAD上,普遍用于中大尺寸PANEL. 系统架构如下: apple 的ALP_DP 源于edp 1.4(edp1.4又是源于DP V1.2a版本) ...
- 42.JSON Web Token认证
JSON Web Token认证介绍 简称JWT认证,一般用于用户认证 JWT是一种相当新的标准,可用于基于token的身份验证 与内置的TokenAuthentication方案不同,JWT不需要使 ...
- 题解 UVA10285 最长的滑雪路径 Longest Run on a Snowboard
Solution 双倍经验 就是记搜嘛. 搞一个二维数组记录一下当前的最长滑雪路径,其他和普通 dfs 没什么两样. 向 \(4\) 个方向搜索,如果高度符合就 \(+1\) . 多测要注意数组初始化 ...
- getAddress和getHostAddress的区别
getAddress方法和getHostAddress类似,它们的唯一区别是getHostAddress方法返回的是字符串形式的IP地址,而getAddress方法返回的是byte数组形式的IP地址.
- 图文详解在VMware Workstation 16 PRO虚拟机上安装Ubuntu 22.04.5 linux系统
一.下载Ubuntu linux系统镜像 机构 下载地址 官网地址 https://cn.ubuntu.com/download 南京大学 https://mirrors.nju.edu.cn/ubu ...
- bugku web基础$_GET
让我们通过url传入what的值,让其等于flag 直接构造url就得到flag了
- SSH SCP 使用秘钥验证 登录
从Win10连接到Ubuntu 22.04. 1. Win10 上生成秘钥公钥 ssh-keygen -t rsa -C "xxx@yyy.com" 2. Ubuntu 22.04 ...
- MySQL数据库:6、约束的概述及语法
Python基础之MySQL数据库 目录 Python基础之MySQL数据库 一.约束概述 1.为什么要约束 2.什么是约束 3.约束的分类 4.查看当前表已有的约束 二.约束语法及用法 1.无符号 ...
- 关于CSDN发布博客接口的研究
前言 其实我之前就有一个想法,实现用 python 代码来发布博客, 因为我个人做了一个发布到 github 博客软件(其实就是实现 git 命令集成,还有markdown的渲染的软件), 如果我弄明 ...
- HSSFSheet XSSFWorkbook SXSSF Java读取Excel数据
HSSF是POI工程对Excel 97(-2007)文件操作的纯Java实现 XSSF是POI工程对Excel 2007 OOXML (.xlsx)文件操作的纯Java实现 SXSSF通过一个滑动窗口 ...