【洛谷】【模拟+栈】P4711 「化学」相对分子质量
【题目传送门:】 [戳] (https://www.luogu.org/problemnew/show/P4711)
[算法分析:]
关于一个分子拆分后的产物,一共有三种情况:
原子
原子团
水合物
关于原子的获取可以使用get_ele()函数,由于不是一位的元素就是两位的元素,只要看看这个大写字母的下一位是不是小写字母就行
返回获取的元素的string
关于系数的获取——使用函数get_num()——与快读的写法很接近,当没有系数的时候(处理后系数还是初始值没有被更新),系数是1
如何获取原子团:
在出现左括号的时候使用get_group()函数
使用get_ele()不停地获取括号内的元素直到下一位是系数或者不是元素,
当下一位是系数的时候获取系数,并且获取这一位的元素,将获取的系数与获取的元素相乘。
其他:
相对原子质量是实数,我们可以把他们都乘以10变成整数,有效地防止了被卡精度
在处理水合物的时候记得水的相对分子质量不应是18而是180
使用map来快速地获取每个元素的相对原子质量。
\([Code:]\)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int MAXN = 1000 + 1;
map<string, int> m;
string str;
int e, c;
int ele[MAXN], coe[MAXN];
void init() {
m["H"] = 10;
m["C"] = 120;
m["N"] = 140;
m["O"] = 160;
m["F"] = 190;
m["Na"] = 230;
m["Mg"] = 240;
m["Al"] = 270;
m["Si"] = 280;
m["P"] = 310;
m["S"] = 320;
m["Cl"] = 355;
m["K"] = 390;
m["Ca"] = 400;
m["Mn"] = 550;
m["Fe"] = 560;
m["Cu"] = 640;
m["Zn"] = 650;
m["Ag"] = 1080;
m["I"] = 1270;
m["Ba"] = 1370;
m["Hf"] = 1785;
m["Pt"] = 1950;
m["Au"] = 1970;
m["Hg"] = 2010;
}
int get_num(int k) {
int i = k + 2, num = 0;
while(str[i] >= '0' && str[i] <= '9')
num = (num << 3) + (num << 1) + str[i] - '0', ++i;
if(!num) num = 1;
coe[++c] += num;
return i;
}
inline string get_ele(int &k) {
string ret;
ret += str[k];
if(str[k + 1] >= 'a' && str[k + 1] <= 'z')
ret += str[++k];
return ret;
}
int get_group(int k) {
int i = k + 1, num = 0;
while(str[i] >= 'A' && str[i] <= 'Z' && str[i+1] != '_')
num += m[get_ele(i)], ++i;
if(str[i + 1] == '_' && str[i] != ')') {
i = get_num(i + 1);
i -= 4;
num += m[get_ele(i)] * coe[c];
i += 4;
coe[c--] = 0;
}
ele[++e] = num;
return i;
}
int get_h2o(int k) {
int i = k + 1, num = 0;
while(str[i] >= '0' && str[i] <= '9')
num = (num << 3) + (num << 1) + str[i] - '0', ++i;
if(!num) num = 1;
ele[++e] = 180, coe[++c] = num;
return i + 5;
}
int main() {
init();
cin >> str;
int l = str.size();
for(int i=0; i<l; ++i) {
if(str[i] == '_') {
i = get_num(i);
continue;
}
if(str[i] == '(') {
i = get_group(i);
continue;
}
if(str[i] == '~') {
i = get_h2o(i);
continue;
}
if(str[i] >= 'A' && str[i] <= 'Z') {
ele[++e] = m[get_ele(i)];
if(str[i + 1] != '_') coe[++c] = 1;
}
}
int ans = 0;
for(int i=1; i<=e; ++i)
ans += ele[i] * coe[i];
cout << ans / 10.0;
}
【洛谷】【模拟+栈】P4711 「化学」相对分子质量的更多相关文章
- P4711 「化学」相对分子质量
P4711 「化学」相对分子质量 给你一个字符串让你输出相对分子质量(弱智字符串模拟) 我比赛tm调了两个半小时啊QAQ 希望以后能增加代码力吧,纪念挂代码 Code #include<iost ...
- 洛谷 8 月月赛 & 「PMOI」Round · 04
T1 T166167 「PMOI-4」人赢 题目大意 给一个数列的前两项分别为\(n\)和\(m\) 当\(i\geq3\)时\(a_i = a_{i-1}*a_{i-2}\)的个位 给定\(n\), ...
- 【luogu P4711 「化学」相对分子质量】 题解
题目链接:https://www.luogu.org/problemnew/show/P4711 要细心模拟 #include <cstdio> #include <algorith ...
- LOJ 2249: 洛谷 P2305: bzoj 3672: 「NOI2014」购票
题目传送门:LOJ #2249. 题意简述: 有一棵以 \(1\) 号节点为根节点的带边权的树. 除了 \(1\) 号节点的所有节点上都有人需要坐车到达 \(1\) 号节点. 除了 \(1\) 号节点 ...
- LOJ 2567: 洛谷 P3643: bzoj 4584: 「APIO2016」划艇
题目传送门:LOJ #2249. 题意简述: 有 \(n\) 个位置,第 \(i\) 个位置可以填在 \([a_i,b_i]\) (\(1\le a_i\le b_i\le 10^9\))之间的整数, ...
- 洛谷 4768 LOJ 2718「NOI2018」归程
[题解] 本题有多种做法,例如可持久化并查集.kruskal重构树等. kruskal重构树的做法是这样的:先把边按照海拔h从大到小的顺序排序,然后跑kruskal建立海拔的最大生成树,顺便建krus ...
- LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美
题目传送门:LOJ #2085. 两个月之前做的傻题,还是有必要补一下博客. 题意简述: 求分子为不超过 \(n\) 的正整数,分母为不超过 \(m\) 的正整数的所有互不相等的分数中,有多少在 \( ...
- 洛谷模拟NOIP考试反思
洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...
- noip模拟9[斐波那契·数颜色·分组](洛谷模拟测试)
这次考试还是挺好的 毕竟第一题被我给A了,也怪这题太简单,规律一眼就看出来了,但是除了第一题,剩下的我只有30pts,还是菜 第二题不知道为啥我就直接干到树套树了,线段树套上一个权值线段树,然后我发现 ...
随机推荐
- 【NET CORE微服务一条龙应用】第一章 网关使用与配置
简介 微服务的系统应用中,网关系统使用的是ocelot,ocelot目前已经比较成熟了 ocelot就不做介绍了,等整体介绍完后再进行各类扩展介绍,ocelot源码地址:https://github. ...
- 操作Linux系统环境变量的几种方法
一.使用environ指针输出环境变量 代码如下: #include<stdio.h> #include<string.h> #define MAX_INPUT 20 /* 引 ...
- [PHP] 算法-删除链表中重复的结点的PHP实现
删除链表中重复的结点: 1.定义两个指针pre和current 2.两个指针同时往后移动,current指针如果与后一个结点值相同,就独自往前走直到没有相等的 3.pre指针next直接指向curre ...
- ngx-echarts响应式图表
一.代码 html代码 <!-- html --> <nz-card style="background-color: #0e0b2a;border: 0px;color: ...
- 小结:ES7——async和await初识
一.async async其实是ES7才有有的关键字,async的意思是异步,顾名思义是有关异步的操作 async用于声明一个函数是异步的. 通常情况下async.await都是跟随promise一起 ...
- jQuery中bind() live() delegate() on() 的区别
实例 bind(type,[data],fn) 为每个匹配元素的特定事件绑定事件处理函数 $("a").bind("click",function(){aler ...
- Salesforce服务云简介
服务云简介 Salesforce的服务云(Service Cloud)是专注于客服和呼叫中心解决方案的子系统.它是Salesforce核心CRM系统的一部分. 服务云特性 服务云提供了客户服务和呼叫中 ...
- Linux 改动inittab文件及忘记密码等导致无法进入系统的解决办法
改动inittab文件及忘记密码等导致无法进入系统的解决办法[摘] by:授客 QQ:1033553122 inittab是linux的系统启动模式配置文件,在”/etc“文件目录下没,其内容是: # ...
- MVC与单元测试实践之健身网站(七)-添加计划
计划的制定涉及到周期-动作包-动作的关联操作,在上一篇<计划的添加与重置>完成了周期的设置.动作包的添加,现在要完成的是动作的添加操作. 一 具体功能 a) 在选定了一个大周期具有的天数 ...
- JavaScript按日期排序之灵活排序
上代码: var dataContent = [ { ID: "1", hobbit: "去音乐", sport: "在篮球", movie ...