一、题目

[题目描述]
化学方程式,也称为化学反应方程式,是用化学式表示化学反应的式子。给出- -组
化学方程式,请你编写程序判断每个方程式是否配平(也就是方程式中等号左右两边的
元素种类和对应的原子个数是否相同)。
本题给出的化学方程式由大小写字母、数字和符号(包括等号=、加号+、左圆括
号(和右圆括号))组成,不会出现其他字符(包括空白字符,如空格、制表符等)。化
学方程式的格式与化学课本中的形式基本相同(化学式中表示元素原子个数的下标用.
正常文本,如H2O写成H20),用自然语言描述如下:
●化学方程式由左右两个表达式组成,中间用一-个等号=连接,如2H2+02=2H20;
●表达式由若干部分组成,每部分由系数和化学式构成,部分之间用加号+连接,
如2H2+02、2H20;
●系数是整数或空串,如为空串表示系数为1;
●整数由一个或多个数字构成; .
●化学式由若干部分组成,每部分由项和系数构成,部分之间直接连接,如H20、
C02、Ca(0H)2、 Ba3(P04)2;
●项是元素或用左右圆括号括起来的化学式,如H、Ca、(OH)、 (P04);
●元素可以是一个大写字母,也可以是一个大写字母跟着一一个小写字母,如H、0、
Ca。

二、分析

有一天早上突然起来,发现自己想漏了一种情况…遂重新写了一份,丢进OJ测试后是满分。
写CSP的大佬们大多是用的C/C++,百度了一下,python的满分代码很少,只找到了一份281ms的代码,还有一些代码跟我之前CCF CSP 201912-3 化学方程式 【Python版】这个版本一样,其实不是超时,是想漏了——官方给的测试点并不全面,需要自己脑中穷举一波。
这道题我能想到的办法是用栈来递归下降,在python性能有限的情况下,这样写出来只需要125ms,我个人还是比较满意。虽然可能还可以继续优化,但我还是先贴出来供大家参考,欢迎大家交流指正。

三、代码部分

# -*- coding: utf-8 -*-
"""
Spyder EditorThis is a temporary script file.
"""
'''
11
Cu+As=Cs+Au
2H2+O2=2H2O
H2+Cl2=2NaCl
H2+Cl2=2HCl
CH4+2O2=CO2+2H2O
CaCl2+2AgNO3=Ca(NO3)2+2AgCl
3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2
3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH
H2+O2=H2O
'''
class E:def __init__(self,in_str):def getNum(i,instr):temp_num=''mylen=len(instr)while i<mylen:if instr[i].isdigit():      temp_num+=(instr[i])i+=1else:breakreturn i,int(temp_num)     def apElem(indict,name,num=1):if name in indict:indict[name]+=numelse:indict[name]=numdef disUpper(indict,instr,i):temps=''sub=1mylen=len(instr)temps+=instr[i]i+=1if i>=mylen:apElem(indict,temps,sub)return ielse:if instr[i].islower():temps+=instr[i]i+=1if i>=mylen:apElem(indict,temps,sub)return ielif instr[i].isdigit():i,sub=getNum(i,instr)apElem(indict,temps,sub)return i else:apElem(indict,temps,sub)return ielif instr[i].isdigit():i,sub=getNum(i,instr)apElem(indict,temps,sub)return ielse:apElem(indict,temps,sub)return idef mergeDict(d1,d2):for i in d2.keys():if i in d1:d1[i]+=d2[i]else:d1[i]=d2[i]def updateCoef(dc,coef):for i in dc.keys():dc[i]*=coefdef disBrackets(indict,instr,i):dt={}listb=[]listb.append(i+1)i+=1mylen=len(instr)while i<mylen:if instr[i]=='(':listb.append(i+1)elif instr[i]==')':l=listb.pop()if(not listb):r=its=instr[l:r]disForm(dt,ts)i+=1breaki+=1if(i<mylen and instr[i].isdigit()):i,tempsub=getNum(i,instr)updateCoef(dt,tempsub)mergeDict(indict,dt)return idef disForm(indict,instr):fdict={}mycoef=-1i = 0mylen=len(instr)while i < mylen:if i==0 and instr[i].isdigit():i,mycoef=getNum(i,instr)elif instr[i].isupper():i=disUpper(fdict,instr,i)elif instr[i]=='(':i=disBrackets(fdict,instr,i)else:i+=1if mycoef!=-1:updateCoef(fdict,mycoef)mergeDict(indict,fdict)instr=in_str.split('=')instr_l=instr[0].split('+')instr_r = instr[1].split('+')dictL={}dictR={}for i in instr_l:disForm(dictL,i)for j in instr_r:disForm(dictR,j)if dictL==dictR:print('Y')else:print('N')n=int(input())
for i in range(n):e=E(input())

请点个赞吧,拜托了TAT

CCF CSP 201912-3 化学方程式配平【Python 满分代码】相关推荐

  1. 用python实现化学方程式配平

    化学方程式配平是指调整化学反应的化学方程式,使得反应中所有的化学元素的原子数目在反应开始和反应结束时相等. 下面是一个简单的 Python 代码,用于配并化学方程式: ``` python 输入化学方 ...

  2. 【自己的小玩具程序】化学方程式配平【测试中】【未完成】

    化学元素周期表(Element.txt): 1    H    氢    1 2    He    氦    4 3    Li    锂    7 4    Be    铍    9 5    B  ...

  3. CCF 2019-12 第三题 化学方程式配平(100分)

    题解: 字符串模拟   题目意思很明确就是判断化学方程式是否配平. 基本思路:就是对化学方程式左边和右边的元素进行计数,然后判断所有的元素的数量是否相等即可.   第一步:对字符串进行拆分       ...

  4. ccf化学方程式配平检验

    样例输入: 11 H2+O2=H2O 2H2+O2=2H2O H2+Cl2=2NaCl H2+Cl2=2HCl CH4+2O2=CO2+2H2O CaCl2+2AgNO3=Ca(NO3)2+2AgCl ...

  5. 有机物燃烧的化学方程式配平(洛谷P1994题题解,Java语言描述)

    题目要求 P1994题目链接 分析 我太菜了,亏得我高中时期还虐(or被虐)生化,如今多年过去竟然没分析出来坑点,我太菜了. 我开始盲目认为"元素守恒",所以对HHH原子数求和, ...

  6. Day9 化学方程式配平

    该题的难点在于括号的嵌套,如Na6((OH)(OH)2)3,比如OH在跳出嵌套之后需乘以紧接着其外的嵌套下标,我的解法是先一遍处理以下找到每个左括号和与之配置的右括号的位置,然后使用递归,每遇到左括号 ...

  7. CCF 202112-2 序列查询新解 python 满分

    CCF 202112-2 序列查询新解 python 满分 题目叙述 问题描述:略 输入格式:略 输出格式:略 样例 满分证明 解题思路 01Python超时70分 02满分python思路 第一,计 ...

  8. CCF 201512-2 消除类游戏 python 满分

    CCF 201512-2 消除类游戏 python 满分 题目叙述 问题描述:略 输入格式:略 输出格式:略 样例 满分证明 解题思路 满分代码 优化代码 题目叙述 问题描述:略 输入格式:略 输出格 ...

  9. CCF 201909-2 小明种苹果(续) python 满分

    CCF 201909-2 小明种苹果(续) python 满分 题目叙述 问题描述:略 输入格式:略 输出格式:略 样例 满分证明 解题思路 自己版本 大佬版本 满分代码 满分代码一 自己版本 满分代 ...

  10. Python趣用—配平化学方程式

    不知不觉已经毕业多年了,不知道大家是否还记得怎么配平化学方程式呢?反正小编我是已经记不太清了,所以今天的文章除了分享如何用python配平化学方程式,顺带着还会复习一些化学方程式的知识,希望广大化学爱 ...

最新文章

  1. jquery 背景特效实现_html5实现的仿网页版微信聊天界面效果源码
  2. RFID--Radio frequency Identification
  3. Flink 生态:Pulsar Connector 机制剖析
  4. Cocos Creator 如何在 VideoPlayer 上面放置 UI 控件
  5. 解决:Win10 程序切换/系统提示弹窗不在顶层
  6. 解决​excel里一复制就卡死的经验分享【转】
  7. Python(基础)输出与输入
  8. QT项目--简易音乐播放器
  9. 裸辞之后自己在家接单是什么体验?
  10. 2018年世界计算机超算大赛,在世界大学生超级计算机竞赛(ASC18)总决赛中 青海大学超算团队成功获得ASC竞赛全球一等奖...
  11. 编写一个c语言 输入abc 输出最大数,C语言 输入abc,求最大数
  12. 苹果你深深的伤害了我,还不让我说
  13. iPhone XS 陷“充电门”:待机状态拒绝充电
  14. 保护FTP和SFTP服务器的10个基本技巧
  15. BELLHOP 关于Actup冲激响应的绘制
  16. Linux安装中文输入法(谷歌输入法和搜狗输入法)
  17. 求生之路2服务器搭建(基于LinuxGSM一键完成,完美支持8人)
  18. Android学习 - Material Design设计规范
  19. 首次曝光!唯一全域最高等级背后的阿里云云原生安全全景图
  20. 高中学计算机都是学什么,计算机有哪些专业主要学什么

热门文章

  1. 《战双帕弥什》的动作打击感是怎么做出来的
  2. MacOS 开发 - isFlipped(坐标系)
  3. 高效非支配排序ENS python版
  4. SQL - 数据查询语句之字符串拆分
  5. 科研狗的英语翻译小众软件
  6. 偶的流氓老公zt (超搞笑-转)
  7. matlab中 seek,VBA中的seek与matlab中的fseek的说明 | 学步园
  8. php如何采集有验证码的网页信息,网页数据采集出现验证码的解决方法 - 八爪鱼采集器...
  9. eclipse配置red5服务器
  10. Unity Fingers Gesture手势插件教程(新)