第33次CSP认证Q3:化学方程式配平

🍄题目描述

为了配平一个化学方程式,我们可以令方程式中各物质的系数为未知数,然后针对涉及的每一种元素,列出关于系数的方程,形成一个齐次线性方程组。然后求解这个方程组,得到各物质的系数。这样,我们就把化学方程式配平的问题,转化为了求解齐次线性方程组的问题。 如果方程组没有非零解,那么这个方程式是不可以配平的。反之,如果方程组有非零解,我们就可能得到一个配平的方程式。当然,最终得到的方程式仍然需要结合化学知识进行检验,对此我们不再进一步考虑,仅考虑非零解的存在。

例如要配平化学方程式:Al2(SO4)3+NH3⋅H2O→Al(OH)3+(NH4)2SO4Al2​(SO4​)3​+NH3​⋅H2​O→Al(OH)3​+(NH4​)2​SO4​

首先假定所有物质在方程的同一侧,即不考虑哪个是反应物,哪个是生成物,分别设这些物质的系数为 𝑥1,𝑥2,𝑥3,𝑥4x1​,x2​,x3​,x4​,则可以针对出现的各个元素,列出如下的方程组:

用矩阵的形式表示为:

对系数矩阵实施高斯消元,得到系数矩阵的一个行阶梯形式:

由此可见,系数矩阵的秩为 3。根据线性代数的知识,我们知道,齐次线性方程组 𝐴𝑋=0AX=0 的解空间的维数等于其未知数个数减去系数矩阵的秩 rank𝐴rankA。而要让方程式配平,即要求方程组存在非零解, 那么就需要让解空间的维数大于 00,即系数矩阵的秩小于未知数个数。因此,我们可以通过判断系数矩阵的秩是否小于未知数个数,来判断方程式是否可以配平。如果可以配平,则可以通过解的符号来判断反应物和生成物的位置。

本题中,我们将给出一些化学方程式,请你按照上述方法判断它们是否可以配平。为了便于程序处理,我们用到的化学式,会被化简为只包含小写字母和数字的字符串,不包含括号。 其中连续的字母表示一种元素,随后的数字表示原子个数。原子个数为 1 时不省略数字;一个化学式中包含的元素不重复。例如,上述方程式中的化学式可以化简为 al2s3o12n1h5o1al1o3h3n2h8s1o4

输入格式

从标准输入读入数据。

输入的第一行包含一个正整数 𝑛n,表示需要判断的化学方程式的个数。

接下来的 𝑛n 行,每行描述了一个需要被配平的化学方程式。包含空格分隔的一个正整数和全部涉及物质的化学式。其中,正整数 𝑚m 表示方程式中的物质;随后的 𝑚m 个字符串,依次给出方程式中的反应物的化学式和生成物的化学式。

输出格式

输出到标准输出。

输出包含 𝑛n 行,每行包含字母 Y 或 N,表示按题设方法,所给待配平化学方程式能否配平。

🍄AC代码

#include<bits/stdc++.h>
using namespace std;//统计某物质中的全部元素个数
map<string,int> analyse(string s){map<string,int> mmap;string element="";string number="";int flag=0; // 0表示元素,1表示元素个数for(int i=0;i<s.length();i++){if(!(s[i]>='0'&&s[i]<='9')){//字母if(flag==1){//从数字转为字母,说明循环到新的元素了,需要把上一个元素的数量放入mapflag=0;//此时element和number都表示上一个元素的,放入map后需清空mmap[element]=stoi(number);element="";number="";}element+=s[i];}else{//数字if(flag==0){flag=1;}number+=s[i];}}mmap[element]=stoi(number);return mmap;
}//计算矩阵的秩
int compute_zhi(vector<vector<double>> matrix){int m=matrix.size(),n=matrix[0].size();for(int pos=0;pos<n;pos++){if(matrix[pos][pos]==0){//在剩余行中找到第一列数字不为0的行与当前行交换int flag=0;for(int i=pos+1;i<m;i++){if(matrix[i][pos]!=0){flag=1;swap(matrix[i],matrix[pos]);}}if(!flag) continue; //如果其余行的第一列都为0,则跳过本轮循环}for(int i=pos+1;i<m;i++){double t=matrix[i][pos]/matrix[pos][pos]; if(t==0) continue;   //倍数为0,整行元素不变,跳过for(int j=pos;j<m;j++)matrix[i][j]=matrix[i][j]-matrix[pos][j]*t;}}//对最后一列元素从倒数第一行遍历,统计为0的行数,矩阵的秩=总行数-0的行数int cnt=0,p=m-1;while(matrix[p--][n-1]==0) cnt++;return m-cnt;}//判断化学方程式否能配平
void judge(int n){string s;vector<map<string,int>> v;  //记录每个物质中的元素个数map<string,int> ele_sort; //记录元素在矩阵中的行下标int cur_sort=0;  //当前元素行下标for(int i=0;i<n;i++){cin>>s;//统计物质中每个元素的个数map<string,int> mmap=analyse(s);v.push_back(mmap);for(auto it=mmap.begin();it!=mmap.end();it++){//如果物质中的某元素还未出现过,则放入元素集合中if(ele_sort.find(it->first)==ele_sort.end()){ele_sort[it->first]=cur_sort++;}}}//生成二维矩阵vector<vector<double>> matrix(ele_sort.size(),vector<double>(n));for(int i=0;i<n;i++){for(auto it=v[i].begin();it!=v[i].end();it++)matrix[ele_sort[it->first]][i]=it->second;}if(matrix.size()<n){//如果元素个数小于物质个数,一定能配平cout<<"Y"<<endl;}else{//计算矩阵的秩并判断int r=compute_zhi(matrix);if(r<n) cout<<"Y"<<endl;else cout<<"N"<<endl;}}int main(){int n,m;cin>>n;for(int i=0;i<n;i++){int m;cin>>m;judge(m);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/698562.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【脚本】使用脚本备份docker中部署的mysql数据库

v1版本明文密码方式&#xff1a; #!/bin/bash# 定义 MySQL 容器名称和数据库信息 container_name"mysql_container" db_user"root" db_password"your_password"# 定义要备份的数据库列表 databases("database1" "database2"…

回归预测 | Matlab实现SMA-GPR黏菌算法优化高斯过程回归多变量回归预测

回归预测 | Matlab实现SMA-GPR黏菌算法优化高斯过程回归多变量回归预测 目录 回归预测 | Matlab实现SMA-GPR黏菌算法优化高斯过程回归多变量回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现SMA-GPR黏菌算法优化高斯过程回归多变量回归预测 1.Matlab实现…

tomcat--java的安装

组成 语言、语法规范。关键字,如: if、for、class等源代码 source code依赖库&#xff0c;标准库(基础)、第三方库(针对某些应用)。由于底层代码太难使用且开发效率低&#xff0c;封装成现成的库JVM虚拟机。将源代码编译为中间码即字节码后,再运行在JVM之上 jdk和jre 概念 j…

win server服务器 关闭危险端口 135,137,138,139,445的方法

通过防火墙来控制 打开控制面板 选择检查防火墙状态 选择高级设置 选择入站规则&#xff0c;再新建规则 选择端口&#xff0c;下一步 选择端口应用于啥协议&#xff0c;再指定端口&#xff0c;再下一步 选择阻止连接&#xff0c;下一步 下一步 给规则别名一下&#xff0c;方便…

解决离线服务器无法加载HuggingFaceEmbeddings向量化模型的问题

由于服务器是离线的&#xff0c;因此我先在本地到huggingface官网下载模型text2vec&#xff0c;然后上传到服务器上运行&#xff0c;报错&#xff1a; (MaxRetryError(HTTPSConnectionPool(host\huggingface.co\, port443): Max retries exceeded with url: /api/models/senten…

C语言 8 函数递归

目录 1. 递归是什么&#xff1f; 2.递归的限制条件 3. 递归举例1 4. 递归举例2 5.迭代 6. 递归举例3 拓展学习&#xff1a; 1. 递归是什么&#xff1f; 递归是学习C语⾔函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xff1f; 递归其实是⼀种解决问题的⽅法&#xff0c…

2024全新小狐狸AI免授权源码

源码安装说明&#xff1a; 下 载 地 址 &#xff1a; runruncode.com/php/19757.html 1. 在宝塔新建一个站点&#xff0c;选择 PHP 版本为 7.2、7.3 或 7.4。将压缩包上传到站点的根目录&#xff0c;并设置运行目录为 /public。 2. 导入数据库文件&#xff0c;该文件位于 …

电脑D盘XLS文件怎么恢复?6个恢复方法,找回丢失的文件!

在日常工作和学习中&#xff0c;我们经常会使用到XLS文件&#xff0c;也就是Excel表格文件。然而有时由于误操作或其他原因&#xff0c;我们可能会发现电脑D盘中的XLS文件突然不见了。这时如何快速、有效地恢复这些文件&#xff0c;成为了我们待解决的问题。本文将为大家介绍五…

Android 异常开机半屏重启代码分析

Android 的稳定性是 Android 性能的一个重要指标&#xff0c;它也是 App 质量构建体系中最基本和最关键的一环&#xff1b;如果应用经常崩溃&#xff0c;或者关键功能不可用&#xff0c;那显然会对我们的留存产生重大影响所以为了保障应用的稳定性&#xff0c;我们首先应该树立…

【JavaEE 初阶(六)】网络编程

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多网络知识 目录 1.前言2.浅谈网络2.1基本知识2.2.OSI与TCP/IP 3.网络编程3.1TCP与UDP区别3.2UDP网路编程…

webpack生成模块关系依赖图示例:

npm i -D webpack-bundle-analyzer core-js babel-loaderwebpack.config.js const BundleAnalyzerPlugin require(webpack-bundle-analyzer).BundleAnalyzerPlugin; module.exports {entry: ./src/index.js,output: {filename: main.js,},// mode: production, // 或者 produ…

圈子系统开发,圈子系统源码, 圈子论坛系统,兴趣社区圈子论坛,一站式搭建,前端uniapp,后端think PHP

简述 圈子论坛社区系统&#xff0c;含完整的后台PHP系统。功能&#xff1a;小程序授权登陆&#xff0c;H5和APP&#xff0c;手机号登陆&#xff0c;发帖&#xff0c;建圈子、发活动。圈主可置顶推荐帖子&#xff0c;关注、点赞、评论、交流等。可作为圈子贴吧等自媒体。 兴趣…