CCF-CSP题解 201912-3化学方程式【字符串处理+模拟】

【CCF CSP历年考试带注释全题解 C++版】201912-3 化学方程式 #include <iostream> #include <unordered_map> using namespace std; unordered_map<string, int> record; int count = 0; bool recursion(string cur, bool add, int time); int main() {... 阅读详情

奥利给!先放个题目链接

201912-3化学方程式

在这里插入图片描述在这里插入图片描述在这里插入图片描述

思路和感悟:

这题真是去年参加CSP的败笔!明明已经做对了几个测试点,最后却提交了个全错的,把对的顶走了!!!每每想起,都想打自己一顿!算了,怎么能打自己呢!砸键盘吧!
今天又做了一遍,做了9个测试的的内容,但是不知道咋回事,加入数字那一块的测试点就是过不了OTZ,只得了40分······想用STL,尤其是stringstream,无奈学识实在浅薄,用不好,只会空格分割和格式转换。
然后我就参考了一位大佬的代码,真的是太妙了TAT

总结一下

#include <sstream>
using namespace std;
int main(){
	string str="4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH";
	stringstream ss(str);
	string lstr,rstr;
	getline(ss,lstr,'=');
	cout<<lstr<<endl//4Au+8NaCN+2H2O+O2
	getline(ss,rstr);
	cout<<rstr<<endl;//4Na(Au(CN)2)+4NaOH
	
	string item;
	while(getline(rstr,item,'+'){
		cout<<item<<endl;//4Au//8NaCN//2H2O//O2
	}
	return 0;
}
/***********************************************************/
#include <cctype>
using namespace std;
int main(){
	char c1='a';
	char c2='A';
	char c3='1';
	if(islower(c1))//判断是否小写字母
	    cout<<c1<<endl;//a
	if(isupper(c2))//判断是否大写字母
	    cout<<c2<<endl;//A
	if(isdigit(c3))//判断是否数字
	    cout<<c3<<endl;//1
}
/***********************************************************/
vector向量作为常用的容器之一,某些时候很好用,
比如邻接表,有时也能代替栈和队列使用,
多做题、多总结、多学习。

测试样例

11
H2+O2=H2O
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
Cu+As=Cs+Au
完整代码(100分)
#include<cctype>
#include<iostream>
#include<string>
#include<sstream>
#include<map>
#include<vector>
using namespace std;

struct Elem{
    string name;
    int num;
    Elem(string _name,int _num):name(_name),num(_num){}
};

int toNumber(string str,int &pos){//得到系数,如2,12,123
    int num=0;
    while(isdigit(str[pos])){
        num=num*10+str[pos]-'0';
        pos++;
    }
    return num;
}

void calc(string &str,map<string,int> &mp){//对式子两边表达式分别进行元素的统计
    stringstream ss(str);
    string item;

    while(getline(ss,item,'+')){//对每个化学式进行更细化的分析,如4Na(Au(CN)2)
        vector<Elem> arr;
        int factor=1;//初始化化学式的系数为1
        int i=0;

        if(isdigit(item[i]))//如果由系数
            factor=toNumber(item,i);

        while(i<item.size()){//往后继续分析
            if(isupper(item[i])){//当前字符为大写字母
                string name;
                name+=item[i++];
                if(islower(item[i])){//如果下一位是小写字母,则是Cu这一类的元素
                    name+=item[i++];
                }//否则就是H这种单字符元素
                arr.push_back(Elem(name,1));//初始数量为1
            }
            else if(item[i]=='('){//当前字符为左括号
                arr.push_back(Elem("(",0));
                i++;
            }
            else if(item[i]==')'){//当前字符为右括号
                arr.push_back(Elem(")",0));
                if(!isdigit(item[++i]))
                    item.insert(i,"1");//如果()后无系数,则插入个1,
                                                    //这样每经过一个')'都会开始检查数字字符
            }
            else if(isdigit(item[i])){//*当前字符为数字,处理嵌套的核心代码
                int num=toNumber(item,i);
                if(arr[arr.size()-1].name==")"){//看看这个系数是单个元素的系数,
                                                                        //还是一个根的系数,如(OH)2,这里是判断根
                                                                        //注,该系数未插入到arr里
                    int j=arr.size()-1;
                    arr[j].name="*";//访问过,标记为*
                    while(arr[--j].name!="("){//遇到第一个name为'('的Elem
                        arr[j].num*=num;//过程中的每个Elem的数量都乘系数
                    }
                    arr[j].name="*";//标记
                }
                else{
                    arr[arr.size()-1].num*=num;//是单个元素的系数
                }
            }
        }
        for(i=0;i<arr.size();i++){//统计入map里
            if(arr[i].name=="*")
                continue;
            mp[arr[i].name]+=arr[i].num*factor;
        }
    }
}

bool judge(map<string ,int> &lmp,map<string ,int> &rmp){//判断是否合法
    if(lmp.size()!=rmp.size())//不加的话,最后一个测试点过不了
        return false;
    for(map<string ,int>::iterator it=lmp.begin();it!=lmp.end();it++)
        if(it->second!=rmp[it->first])
            return false;
    return true;
}


int main(){
    int n;
    cin>>n;
    while(n--){
        string str,lstr,rstr;
        cin>>str;
        stringstream ss(str);
        map<string ,int> lmp,rmp;
        getline(ss,lstr,'=');//cut
        getline(ss,rstr);

        calc(lstr,lmp);//run
        calc(rstr,rmp);

        if(judge(lmp,rmp))//result
            cout<<"Y"<<endl;
        else
            cout<<"N"<<endl;

    }
}
CSP CCF: 201912-3 化学方程式 (C++) 目录题目来源知识点注意点20分 但得了 30分40分 题目来源 化学方程式 知识点 注意点 20分 但得了 30分 数据特点: 只包含大写字母和等号 解决方案: 1. 使用 map<string, int> elemL, elemR 来存储化学方程式左右两边的元素及个数 2. 使用 getEqualSignIndex() 函数 获取化学方程式的等号下标 3. 使用 getElem() 函数 获得等式左右元素及个数 4. 最后判断elemL、elemR中元素个数是否相等。 若相等,那每个元素的 阅读详情

相关推荐

CCF-CSP题解 201912-3化学方程式

化学方程式的配平检验 第一次去考,有些紧张,第三题本来很简单的,愣是没写出来,放假了有空写了写,自我感觉可读性还可以。 因为ccf官网上还没有开放模拟,我就自己写了个.txt文件检验一下,基本要求都满足了。 主要用了unordered_map作为元素记录,stringstream作为字符串分割工具。 #include <iostream> #include <string>...

weixin_44617992的博客 3755

201912-3 化学方程式 70分【CCF-CSP真题】

费了九牛二虎之力只拿了70分,还没来得及写递归 先占坑吧 等写满分了再更 #include<bits/stdc++.h> using namespace std; map<string,int> m1,m2; vector<string> v; string str; int find(int i) { int cnt3=0; while(1) { if(str[i]==')') break; i++; } i++; while(str[i]>

Winnie的博客 243

2019年12月CSP第三题【化学方程式】Java代码

2019年12月CSP第三题化学方程式的Java代码,已在官网上验证,100分通过。主要思想来自编译原理。

CSP 201912-3 化学方程式 100分

这是我的第二篇博客,小学期的程序设计课程设计告一段落,内容是完成201912的CSP认证考题,我完成了前三题。攻克难题还是非常有成就感的,所以发博客纪念一下。最近也是在进行ACM的训练,希望自己能再接再厉,不断提高编程能力。 题目内容:判断化学方程式是否配平 [输入格式] 从标准输入读入数据。 输入的第一行包含一个正整数n,表示输入的化学方程式个数。接下来n行,每行是一个符合定义的化学方程式。 [输出格式] 输出到标准输出。 输出共n行,每行是一个大写字母Y或N,回答输入中相应的化学方程式是否配平。 [样例

weixin_46283740的博客 872

Anaconda镜像源切换全攻略:从清华源到恢复默认设置的完整流程

本文详细介绍了Anaconda镜像源的管理与优化,重点讲解了如何配置清华源以提升国内下载速度。内容涵盖镜像源工作原理、清华源详细配置步骤、多源管理策略、常见问题排查以及如何安全恢复默认设置,帮助用户构建完整的镜像源管理体系。

weixin_28828243的博客 1021

从镜头到像素:深入解析Camera、Sensor与V4L2的协同工作流

本文深入解析了摄像头从物理成像到软件控制的完整工作流。详细介绍了镜头、传感器(Sensor)与V4L2框架的协同机制,涵盖光电转换、同步信号、ISP图像处理等核心环节,并通过实战演示了如何使用v4l2-ctl工具进行调试,为嵌入式开发和驱动调试提供系统指南。

weixin_29230805的博客 389

CSP 201912-3 化学方程式(python)

文章目录题目考场代码结果 题目 这题是一道典型的字符处理题,比较复杂,但题目中给出的巴科斯范式是一个提示,可以让你快速理清代码思路。但是本人在考场上时直接忽略这部分范式,以为是废话。。。。 所以看完题目就直接开干,最后花了两个多小时才写出来。。。看完这题时,很明显处理括号是需要递归分析的。想明白这个基本就能开写了。由于用的是python,很容易就超时,所以最后只拿到70分,但代码肯定是对的。 考...

qq_42295427的博客 1055

从零搭建医疗化验单识别系统:深度学习+OCR实战教程(附数据集)

本文详细介绍了如何从零开始构建一个医疗化验单智能识别系统。通过融合深度学习和OCR技术,系统能够应对版式多样、内容专业的医疗单据,实现从文本检测、识别到关键信息结构化抽取的全流程。文章提供了数据集处理、模型选型、训练微调及工程化部署的实战指南,并分享了避坑经验与性能优化策略,为开发者解决医疗信息化痛点提供了完整的技术方案。

k9l0m1的博客 492

CCF CSP认证考试201912题解(1,2,3,4)

【缘起】 从acm退役十个月了,目前正在准备研究生复试,其中机试部分与CCF题目相仿,所以练习一下CCFSCP往届题目。记一下题解,一是加深印象,二是希望对其他考研人有所帮助。 【题目来源】 http://www.cspro.org/ 进入后点击报名入口,注册or登录,然后右上角有个模拟考试,点击去会看到95道往届CCFCSP认证真题。以下题解按考试日期编号。由于官网题面给的...

雪的期许 2076

双目视觉入门实战:用Matlab标定相机,再到Python OpenCV完成测距的完整链路

本文详细介绍了双目视觉技术的完整实现流程,从Matlab相机标定到Python OpenCV测距的全链路实践。重点解析了Matlab与OpenCV的参数转换技巧,以及立体校正、视差计算等关键步骤的代码实现,帮助开发者快速掌握双目测距系统的搭建方法。

weixin_29166013的博客 445

【GameFramework框架】一、框架介绍

这是GameFramework框架教程的第一篇,但是博主不准备直接就讲GameFramework框架。【GameFramework框架】二、GameFramework框架介绍了。框架(Framework)通常被理解为一种基础要素的集合,它们用于承载系统的必要功能。约束性:框架定义了解决特定问题的边界,并将相关的软件组件约束在这个范围内,以保持框架的内聚性和解决问题的专注性。支撑性:框架本身不直接解决问题,而是提供一个基础的支撑结构,使得在其上构建的解决方案更为灵活和高效。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1万+

CCF CSP入坑指南 (含难度分析 试题目录及答案 部分答案有解析更新至201912 包含全部前四道题解及小部分第五题解)

第一题 基础数据处理,包括大小比较、计数、排序,不超过一层的for循环。 第二题 递推,排序,不超过三层的for循环。 第三题 字符串处理,递推,考查数据结构构造能力,不超过三层的for循环。 第四题 动态规划,贪心算法,图论最短路径,最小生成树等。 第五题 网络流,图论,字符串,考查数据结构构造能力,以及非常人的随机应变能力。 ...

宋旭升的博客 6万+

链接文件及功能安全:S32K3如何将FLASH驱动放到RAM里面、RAM如何实现软件复位数据不丢失操作。

在通过RTD的SDK也好MCAL也好,始终存在一个问题,生成的代码除了看门狗模块,默认都是放在flash里面,按照正常逻辑来看没啥大的问题,思考一个问题:Flash放在0x100的位置,但是此时我们要操作0x100怎么办?那肯定不允许啊,但是将flash的驱动放在RAM里面就可以避免这个问题的产生。Flash的特性:PF0能操作PF1,当然PF1也能操作PF0的,以此类推,只要不操作自身,想怎么玩都可以。这也是一个物理特性吧。

梦想技术家 2310

CCF-CSP认证 201912-3 化学方程式

CCF-CSP认证 201912-3 化学方程式 题意描述 给出n个化学方程式 让我们判断化学方程式是否配平 输入输出格式 输入第一行包含一个整数n表示方程式的数量 接下来是n行化学方程式 数据规模 n在[1,100] 之间 算法设计 个人认为 这应该是CSP第三题中最好读懂题意的题目了 就是给几个化学方程式 让我们去判断方程式是否配平 直接上字符串处理 但是说来容易 仔细想一想 我们需要考虑的细节还是不少的 我列出了以下需要解决的问题 以及相应的解决方案 如何去判断方程式是平的? 我们建立一张图 map

cxw789的博客 762

【行为决策模块项目实战】解耦控制--多控制器管理与切换的方法(附C++代码)

[请添加图片描述](https://img-blog.csdnimg.cn/c11300d9e4fe421e9070f474a468d1db.jpeg)本文先对多控制器管理与切换的方法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容VERTICAL_VEL, //垂直速度PID控制器VERTICAL_POS, //垂直位置PID控制器HORIZONTAL, //水平速度PID控制器YAW, //航向角yaw位置逻辑控制器。

qq_35635374的博客 1211

RK3588芯片USB OTG模式切换:Device到Host的驱动奥秘之旅

摘要:本文详细介绍了RK3588芯片USB OTG模式从Device到Host的完整驱动流程,包括硬件电路设计、内核驱动配置、模式切换机制及验证方法。RK3588芯片凭借强大的性能和灵活的USB OTG特性,在工业控制、智能家居等领域具有广泛应用前景。文章重点分析了Type-C接口设计、USBPHY芯片选型、Linux内核模块配置等关键技术要点,并提供了模式切换脚本使用方法和常见问题解决方案,为开发者实现RK3588 USB OTG功能提供了全面指导。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 740

CCF CSP认证考试题解目录

CCF认证考试题解目录 编号 标题 题解 分类 备注 201809-1 卖菜 201809-2 买菜 201809-3 元素选择器 201809-4 再卖菜 201809-5 线性递推式 201803-1 跳一跳 C++ 简单模拟 201803-2 碰撞的小球 C++ 中级模拟 201803-3

日沉云起的博客 8万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

CCF认证 201912-3 《化学方程式》

配平的意思为 方程式两边的化学元素的种类和对应的数量相同 算法思路 1、字符串分割 例如 H2+O2=H2O 分割为 H2 O2 H2O CH4+2O2=CO2+2H2O 分割为CH4 2O2 CO2 2H2O 分割符为 +、= 本题目中只有一个=,可能有多个+,并且=将化学方程式分成两部分。 写出一个方法,完成字符串分割 void split(string str,vector<strin...

冰冻三尺非一日之寒 2606

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

CCF-CSP认证201912-3. 化学方程式

题目链接:201912-3化学方程式 难点: ()的多重嵌套.可能出现多个嵌套,一般方法都是递归或者用堆栈,这里用了一个“pass”标记,减轻了工作量。 因为带括号的化学式出现的形式是( ( ( )num1 )num2 )num3…,按下标顺序读入的字符串遇到的第一个数字num1,然后就会处理num1所在的化学式()num1.然后再往后处理num2所在的化学式()num2,依次处理. 所以可以在遇...

Cainell的博客 523

CCF-CSP认证考试准备第十四天 201912-3 化学方程式

4.确定何时弹出一个栈元素并相应操作:遇到')'弹出这一个括号内的map<string,int>,获取上一个括号内的map<string,int>(即为top()),加上这一个括号内的元素下标系数乘以算得的括号系数。6.最后栈顶元素为这一个方程式的map<string,int>,但不包括前面的系数,所以结果map<string,int>为栈顶的map<string,int>乘上传入的前面系数。//提取一个层级的map<string,int>,乘上括号后面的系数。

2301_80044595的博客 808

【CCF-CSP】历年考点全归纳

文章目录传送门打怪升级图202104-1灰度直方图总结 传送门 ccf-csp 打怪升级图 题目编号 题目知识点 分类 201312-1 数组水题 模拟 201312-2 模拟 模拟 201312-3 枚举 枚举 201312-4 动态规划 动态规划 201312-5 BFS BFS/DFS 201403-1 数组水题 模拟 201403-2 网格模拟 模拟 201403-3 复杂模拟 模拟 201403-4 最短路 图论 201403-5 动态规划

文艺倾年的博客 4772

CCF CSP题解目录(题目分类整理)

CCF CSP题解目录(题目分类整理)

我真的不是cjcの博客 1041

CCF-CSP之旅

CCF之旅(C++/python) 主要使用C++,偶尔使用python.(因为有的题用C++太难啦 ????) -_- (不定时更新ing,直到全部题目写完) 2021.4.8 是从第一次2013年ccf开始刷的题, 过了一个月,已经解决72题,但是大多数都是前两题,有一部分的3,4题,极少数的第5题.而且有的是用python实现的。C++代码太复杂了。还有一周(其实还有3天?)就是第22次ccf,打算写博客记录对外输出,也算是复习之前写过的题。 2020年12月 试题编号 试题名称 考

星星亮了bulingbuling~ 476

【CCF 201912-4】区块链(队列:80分)

写在前面 最近几次的CFF-CSP考试,我发现一个趋势。CSP的第3、4题会与计算机的专业知识密切相关。 例如:化学方程式 – 编译原理,RAID5 – 操作系统。而本题涉及到的是分布式系统的应用(区块链)。 题目大意 给出一个网络,每个结点中都有一个主链。 当一个结点的主链更新时,将会向它的邻居发送它的主链;邻居会将这个主链和邻居自己的链进行比较,决定是否接收这个链(即替换自己的链)。 更新有...

Salmon_lee的博客 1429

CCFCSP 201912-3 化学方程式(70分)

思路 大模拟题,没啥可说的,左右两侧分别计算元素数量,然后用vector(单纯喜欢用而已,很多大佬似乎用map)判断左右是否配平。 遇到左括号,虽然可能存在嵌套情况,但只要找到配套的右括号即可。随后便可以通过括号后面的数字来决定括号里的元素需要乘几倍数。 遇到大写字母,看一下后面有没有小写字母了,然后看后面是否有数据,没有数据就默认乘1 遇到右括号,继续进行即可 遇到加号或者方程一开始,需要找到其后面的数字,有数字则需要相乘,没有数字则代表乘1即可 代码 虽然给的测试用例全部通过,但只拿到了70分,求助

Cindy_00的博客 343

CSP/CCF第三题

202109-3 脉冲神经网络 202104-3 DHCP服务器 202012-3 带配额的文件系统 202009-3 点亮数字人生 202006-3 Markdown渲染器 201912-3 化学方程式 201909-3 字符画 201903-3 损坏的RAID5 201812-3 CIDR合并 201809-3 元素选择器 201803-3 URL映射 201712-3 Crontab 201709-3 JSON查询 201703-3 Markdown 201612-3 权限查询 201609-3 炉石

匿名用户 464
上一篇: POJ 1861 Network【最小生成树kruskal,板子题】
下一篇: CCF-CSP题解 201909-4 推荐系统【set+unordered_map+vector】
shiftrain
博客等级 码龄9年 28粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值