题意很简单,给定一个化学方程式,判断是否已经配平,是则输出“Y”,否则输出“N”。

更新:getnum函数的循环在执行前,多加了句清零。就因为少了那句清零,我在90分这里卡了足足两天!!!

顺便有个小问题,化学方程式的右括号后面可以不跟数字的吗?就像Na(OH)这样

#include <bits/stdc++.h>
using namespace std;
map<string,int> ma1, ma2, tmp, tmp1;//ma1记录等号左边所有元素个数,ma2记录右边,tmp与tmp1都是临时变量
string s;
void show(map<string,int> ma1,string ch=" ")//debug时用来输出map内所有的元素
{for(auto i=ma1.begin(); i!=ma1.end(); i++){cout<<(*i).first<<ch<<(*i).second<<endl;}cout<<"\n";
}
void update(map<string,int> &tmp, map<string,int> &ma,int &x)//将tmp内所有元素的个数都乘上x,然后加到ma上
{for(auto it=tmp.begin(); it != tmp.end(); it++){string s=(*it).first;int xx=(*it).second;ma[s] += xx*x;}
}
void update(map<string,int> &ma, int &x)//将ma内每个元素的个数都乘上x
{for(auto it=ma.begin(); it != ma.end(); it++) (*it).second *= x;
}
void getNum(string &s,int &i,int &fl,int &x)//将数字字符串转整数,存放在x内
{fl=x=0;while(s[i]>='0' && s[i]<='9'){x=x*10+s[i++]-'0';fl=1;}
}
void clear(int &x, int &fl, map<string,int> &ma)
{x=0;fl=0;ma.clear();
}
void deal(string &s,int &tmpx,int &i,int &fla,map<string,int> &tmp)//获取单个元素及下标
{string str=string(1,s[i]);//可以保证一定得到的是大写字母 if(s[i+1]>='a' && s[i+1]<='z') str+=s[++i];//如果是小写,则两个连着才是一个元素 fla=0;getNum(s,++i,fla,tmpx=0);//获取下标 i--;if(!fla) tmpx=1;tmp[str]+=tmpx;//元素str的值加上tmpx
}
void slove(string &s,map<string,int> &tmp,int &i,int &len)
{int x=0, f=0, fl=0, fla=0, tmpx=0;for(i++; i<len; i++){if(!fl){getNum(s,i,fl,x);//获取系数 if(!fl) x=1, fl=1;}if(s[i]=='(')//遇到左括号就递归 {map<string,int> tmp1;slove(s,tmp1,i,len);//递归,结果放在tmp1里 getNum(s,++i,fla,tmpx=0);//获取下标 if(!fla) tmpx=1;i--;update(tmp1,tmp,tmpx);//将tmp1里的元素都放到tmp里 clear(tmpx,fla,tmp1);continue;}if(s[i]==')'){update(tmp,x);//乘上系数然后返回 return ;}deal(s,tmpx,i,fla,tmp);//获取单个元素及下标 }
}
int main()
{int n;scanf("%d",&n);while(n--){ma1.clear(), ma2.clear(), tmp.clear(), tmp1.clear();//初始化,全部清空 cin>>s;//输入方程式 int len=s.length(), x=0, f=0, fl=0, tmpx=0, fla=0;for(int i=0; i<len; i++)//遍历 {if(!fl)//取得元素的系数,没有系数则补充系数为1 {getNum(s,i,fl,x=0);//读取数字,将数字字符串转换成整数 if(!fl) x=1, fl=1;}if(s[i]=='=')//左边已经遍历完成 {update(tmp,ma1,x);//将ma1的每个元素的值都更新一下,因为有部分值存储在tmp内。tmp内每个元素的系数都是x clear(x,fl,tmp);//清空 f=1;//标记现在到了等号右边了 continue;}if(s[i]=='+')//更新 {if(f==1) update(tmp,ma2,x);else update(tmp,ma1,x);clear(x,fl,tmp);continue;}if(s[i]=='('){slove(s,tmp1,i,len);//递归得到括号内每个元素的个数,放到tmp1里 getNum(s,++i,fla,tmpx=0);//得到元素后面跟的值,即下标 (应该是叫下标吧?) if(!fla) tmpx=1;//没有下标补充为1 i--;update(tmp1,tmp,tmpx);//更新tmp clear(tmpx,fla,tmp1);continue;}deal(s,tmpx,i,fla,tmp);//得到单个元素及下标 }update(tmp,ma2,x);//更新ma2 if(ma1!=ma2)puts("N");else puts("Y");}
}

来几组样例吧

input:

18
HCl=ClH
H2O=H2+O2
2H2+O2=2H2O
HCl()=ClH()
Ca(OH)2A3=CaA3O2H2
2Ca(OH)2A3=2CaA3O2H2
Ca(OH(CH)2)2A3=CaA3O2H6C4
Ca(OH(CH)2)2A3=CaA3O2H6C5
2Ca(OH)2A3=CaA3O2H2
NaHCO3=Na2CO3+H2O+CO2
2NaHCO3=Na2CO3+H2O+CO2
CuCl2=Cu+Cl2
Cu+4HNO3=Cu(NO3)2+2NO2+2H2O
3Cu+8HNO3=3Cu(NO3)2+2NO+4H2O
Mg+CO2=2MgO+C
2Mg+CO2=2MgO+C
CuCl2=Cu+Cl2
CuSO4+2NaOH=Cu(OH)2+Na2SO4

output:

Y
N
Y
Y
Y
Y
Y
N
N
N
Y
Y
Y
Y
N
Y
Y
Y

csp201912-3 化学方程式 100分相关推荐

  1. CSP 201912-3 化学方程式 100分

    这是我的第二篇博客,小学期的程序设计课程设计告一段落,内容是完成201912的CSP认证考题,我完成了前三题.攻克难题还是非常有成就感的,所以发博客纪念一下.最近也是在进行ACM的训练,希望自己能再接 ...

  2. CCF201912-3 化学方程式(100分)【文本处理】

    试题编号: 201912-3 试题名称: 化学方程式 时间限制: 1.0s 内存限制: 512.0MB 问题链接:CCF201912-3 化学方程式 问题简述:(略) 问题分析:文本处理问题,按字符串 ...

  3. 四川高中计算机学校图片,四川2021年100分能上计算机学校吗

    四川100分能上计算机学校吗?从计算机学校方面所进行分析地话,中专计算机学校所对其学生的各方面要求是比较容易被进行满足的,而从学生所考的100分成绩来说的话,成绩是比较地低的,如果想要报读计算机学校的 ...

  4. 大工计算机基础在线3,大工16秋《计算机应用基础》在线测试3-满分100分.pdf

    大工16秋<计算机应用基础>在线测试3-满分100分大工16秋<计算机应用基础>在线测试3-满分100分 大工 16 秋<计算机应用基础>在线测试 3 试卷总分:1 ...

  5. CCF201503-4 网络延时(100分)

    试题编号: 201503-4 试题名称: 网络延时 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定一个公司的网络,由n台交换机和m台终端电脑组成,交换机与交换机.交换机与 ...

  6. 12门课100分直博清华!这份成绩单冲上热搜,但学霸小伙也曾考过25分

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 金磊 明敏 发自 凹非寺 量子位 报道 | 公众号 QbitAI 一 ...

  7. 食出100分:‘粥’的做法4---鱼片瘦肉粥

        今晚再接再励,又煲了一锅粥,哈哈```最近吃粥吃上瘾了````今晚煲的是:鱼片瘦肉粥.嘿嘿``` 材料:猪肉+鱼肉(切片) 配料:酱油+油+盐+葱+香菜+姜片(看粥量来定分量) 这是葱花(切成 ...

  8. 干货!我的计算机网络怎么考了 100 分的?

    作者 | 轩辕之风O 来源 | 编程技术宇宙(ID:xuanyuancoding) 有读者问我:轩辕,你是怎么学计算机网络的?鸽了好久,今天得空聊聊这个话题. 轩辕是通信工程专业,计算机网络通信自然是 ...

  9. CCF201403-1 相反数(100分)

    试题编号: 201403-1 试题名称: 相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反数(a 和 ...

最新文章

  1. [导入]解决“Internet Explorer 无法打开 Internet站点已终止操作”问题
  2. 训练和验证准确性_通过沉浸式虚拟现实观察动作增强运动想象训练
  3. Minionda3环境的迁移
  4. [转载]AIX 上 Lotus Domino 的内存使用
  5. 【面试锦囊】位运算介绍与经典例题总结
  6. Dotfuscator 4.9 破解版下载地址
  7. Java代码样式运算符换行格式
  8. java 读取webapp文件_在Java Webapp和Java Normal应用中读取公共外部属性文件
  9. ib课程计算机科学教材,IB国际课程包括哪些学科内容?IB国际课程都有哪些教材?...
  10. 未经专业销密的计算机设备,DOC1-题
  11. 如何永久的关闭macOS 更新提示?
  12. Docker(包括docker、mysql、tomcat的安装,以及部署web工程文件)
  13. ireport实现金额小写转大写
  14. java中的URLEncoder和URLDecoder类
  15. drcom linux最新版,Ubuntu高于8.04版本的源码安装drcom
  16. JS如何改变元素内容?
  17. 【Linux】数字ICer需要用到哪些Linux命令?
  18. php 调用微信支付的时间戳,前端调用微信支付接口
  19. 小程序发布一年做了什么?错过将遗憾数年的3个大势
  20. 如何利用电位器控制舵机

热门文章

  1. 单页面和多页面应用场景总结
  2. python调用msfconsole全自动永恒之蓝攻击_使用Metasploit复现永恒之蓝攻击
  3. Spark运行模式Standalone 模式
  4. 视频监控项目--友善之臂---阿里云---QT---mjpg-streamer
  5. 如何减少iPhone / iPad上的iCloud备份数据大小?
  6. 王丁|怀念王太庆先生
  7. 盘点腾讯十大成功产品
  8. 无约束优化问题之Hooke-Jeeves法(模式搜索法)
  9. 【个人感悟】暑期总结与感想
  10. 灵魂拷问:你是否懂得所有的Vue模板语法呢?