【题目传送门:】 [戳] (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;
}

转载于:https://www.cnblogs.com/devilk-sjj/p/9202659.html

【洛谷】【模拟+栈】P4711 「化学」相对分子质量相关推荐

  1. P4711 「化学」相对分子质量

    月赛的经典模拟题 模拟水题调到要死,但是还是能1A,还是很爽的. 这道题可以直接用scanf读入一行,用fgets会读入一个'\n',我不喜欢. 然后用一个变量从左到右扫一遍. 如果读到了大写字母,那 ...

  2. Luogu4711「化学」相对分子质量

    原题链接:https://www.luogu.org/problemnew/show/P4711 「化学」相对分子质量 题目过水,题面过长不想搬运系列... dark d a r k dark♂模拟即 ...

  3. 「化学」相对分子质量

    题目描述 做化学题时,小 F 总是里算错相对分子质量,这让他非常苦恼. 小 F 找到了你,请你来帮他算一算给定物质的相对分子质量. 如果你没有学过相关内容也没有关系,你可以从样例和提示里理解该题所求内 ...

  4. luogu4711 「化学」相对分子质量

    http://www.elijahqi.win/archives/3808 恶心模拟 #include<bits/stdc++.h> using namespace std; map< ...

  5. LOJ 2085: 洛谷 P1587: bzoj 4652: 「NOI2016」循环之美

    题目传送门:LOJ #2085. 两个月之前做的傻题,还是有必要补一下博客. 题意简述: 求分子为不超过 \(n\) 的正整数,分母为不超过 \(m\) 的正整数的所有互不相等的分数中,有多少在 \( ...

  6. 2020 CCF非专业级别软件能力认证第一轮(LGR-10)洛谷模拟试题试卷

    2020 CCF非专业级别软件能力认证第一轮 (LGR-10)洛谷模拟试题试卷 认证时间:2020年10月8日09:30-11:30 一.单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正 ...

  7. 洛谷——P1044 栈

    P1044 栈--卡特兰数 题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈) ...

  8. 洛谷 P1044 栈 [卡特兰数]

    题目背景 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即 poppop (从栈顶弹出一个元素)和 pushpush (将一个元素进栈). 栈 ...

  9. 表达式括号匹配_洛谷1739_栈

    题目背景 你猜 题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹 ...

最新文章

  1. layoutSubviews 调用情况
  2. 【80端口占用】win7下80端口被(Pid=4)占用的解决方法
  3. 15个著名的设计心理学原理以及在设计中的应用
  4. 上传文件时的后台处理
  5. 将图片文件通过byte[]字节数组Base64加密后给前端显示
  6. 游戏筑基开发之动态数组(C语言)
  7. 小D课堂 - 新版本微服务springcloud+Docker教程_2_02 微服务核心基础讲解
  8. 你对云存储的安全性了解多少?
  9. 【互联网协议】北邮国际学院大三上基础知识
  10. 教你玩转注册表!!!
  11. nove6怎么升级鸿蒙系统,华为手机怎么升级鸿蒙,华为鸿蒙系统支持手机型号大全...
  12. Matlab答疑五:使用微分定义求解微分方程的数值解
  13. 一键重装系统后电脑黑屏怎么办,电脑系统重装黑屏
  14. 使用CFile类的Write()向.txt文档中写入数据
  15. 多方安全计算(MPC)知识汇总
  16. CUMT2020算法上机测试(2020-11-11)
  17. .html .val .text 的区别
  18. 垃圾分类与AI的反碎片之旅
  19. [论文笔记]ENet
  20. java课程设计:基于SSM实现个人健康管理系统

热门文章

  1. linux su无效_linux su 认证失败解决方案转
  2. protobuf官方文档学习
  3. ijkplayer源码---倍速
  4. Windows与网络基础
  5. [rust-003] rust by example学习过程点点滴滴杂记
  6. 服务器多系统ssd寿命检测,检测 SSD 剩余寿命 寿终正寝之前还能挽回数据
  7. 移动通信发展历程见解(从1G到5G发展历程)
  8. 多项式输出(来源暂无)
  9. 2022.10.28 英语背诵
  10. oracle 数据库如何获取一条sql语句执行所消耗耗费的时间?