[CSP-S模拟测试]:炼金术士的疑惑(模拟+数学+高斯消元)
题目传送门(内部题70)
输入格式
第一行一个正整数$n$,表示炼金术士已知的热化学方程式数量。
接下来$n$行,每行一个炼金术士已知的热化学方程式。
最后一行一个炼金术士想要求解的热化学方程式,末尾记为$H=?$。
每个热化学方程式都是规范的,格式如下:
$a\ W\ +\ b\ X\ +\ ...\ =\ c\ Y\ +\ d\ Z\ ...\ H=\ h$
表示$a$单位的$W$、$b$单位的$X$与......反应生成了$c$单位的$Y$、$d$单位的$Z$和......,吸收$h$/放出$-h$单位热量。
$W\ X\ Y\ Z$为化学物质名称,是一个长度不超过$5$的合法标识符(即首字符是大小写字母,其它字符都是大小写字母或数字)。$a\ b\ c\ d$为各化学物质的系数,是一个小数点后不超过$1$位的$\leqslant 10^2$的正实数。
$h$为反应焓变,是一个小数点后不超过$1$位的、绝对值$\leqslant 10^4$的实数。
$+\ =\ H=$部分均为字符串。$=$左边的物质都是反应物,右边的都是生成物。
任何相邻两个元素间都用一个空格隔开,行末无多余空格。
炼金术士的记忆很好,所以不会存在自相矛盾的情况,他回忆起的方程式也一定能够解出问题的答案。
输出格式
输出一行一个实数,表示解出的热化学方程式的焓变,四舍五入保留$1$位小数。
对于每个测试点,您的输出必须与标准答案完全一致才能得分。
样例
样例输入:
2
1 C + 1 O2 = 1 CO2 H= -393.5
1 CO + 0.5 O2 = 1 CO2 H= -283.0
2 C + 1 O2 = 2 CO H= ?
样例输出:
-221.0
数据范围与提示
数据范围:
设$m$为所有方程式中出现过的化学物质的数量。
对于$20\%$的数据,$n=1,m=2$;
对于$40\%$的数据,$n\leqslant 4,m\leqslant 10$;
对于$70\%$的数据,已知方程式没有重复信息(即不存在任意的若干个已知方程式使得它们经过变换后等于另一个已知方程式);
对于$100\%$的数据,$n,m\leqslant 200$。
下面是可能用到的化学知识,学过高中化学选修$4$第一章的同学们可以跳过了。
热化学方程式:
与一般化学方程式的区别:
$1.$一般化学方程式的系数必须是最简整数比关系,而热化学方程式没有要求。
$2.$热化学方程式的末尾有一个位置写明了反应的焓变(热量变化),形如$\Delta H=h$。$h$为正数表示反应吸收了热量,为负数表示放出了$-h$单位的热量。更通俗地来说,设想每种化学物质的单位内能是一定的,那么热化学方程$aW+bX+...=cY+dZ...\Delta H=h$可以这样解释:$a$单位的$W$与$b$单位的$X...$的能量之和,比$c$单位的$Y$与$d$单位的$Z...$的能量之和少$h/$多$-h$。
比如$H_2+\frac{1}{2}O_2=H_2O\ \Delta H=-h$
表示一个单位氢气与半个单位氧气生成一个单位水,放出$h$单位热量。
或者说一个单位氢气的内能加上半个单位的氧气的内能,比一个单位水的内能多$h$。
因为系数没有要求,所以上式等价于$2H_2+O_2=2H_2O\ \Delta H=-h$
因为广义下任何反应都是可逆的,于是上式还等价于$H_2O=H_2+\frac{1}{2}O_2\ \Delta H=h$
加减消元法:
盖斯定律:若一反应为二个反应式的代数和时,其反应热为此二反应热的代数和。也可表达为在条件不变的情况下,化学反应的热效应只与起始和终了状态有关,与变化途径无关。
也就是说,我们可以根据已知的热化学方程式,做上面提到的两种等价变换,再把若干方程式按照等式的法则做加减法,可以得到新的热化学方程式。下面举两个例子:
例$1$
$\begin{array}{ll} C+O_2=CO_2\ & \Delta H=h_1——① \\ CO+\frac{1}{2}O_2=CO_2\ & \Delta H=h_2——②\end{array}$
求$2C+O_2=2CO$的焓变。
解:②反向变换得
$CO_2=CO+\frac{1}{2}O_2\ \Delta H=-h_2——③$
$①+③$,左右两边消去$CO_2$得
$C+\frac{1}{2}O_2=CO\ \Delta H=h_1-h_2$
最后两边同时$\times 2$得
$2C+O_2=2CO\ \Delta H=2(h_1-h_2)$
例$2$
已知
$\begin{array}{ll} H_2+\frac{1}{2}O2=H_2O\ & \Delta H=h_1——① \\ CH_4+2O_2=CO_2+2H^2O\ & \Delta H=h_2——② \\ C_2H_4+3O_2=2CO_2+2H_2O\ & \Delta H=h_3——③ \\ C_2H_6+\frac{7}{2}O_2=2CO_2+3H_2O\ & \Delta H=h_4——④\end{array}$
求$C_2H_4+H_2=C_2H_6$的焓变。
解:$①+③+$(反向$④$)得
$C_2H_4+H_2=C_2H_6\ \Delta h_1+h_3-h_4$
可以发现题目中的$②$为多余条件。
题解
先明确一下题目中所说的$m$,其实就是不同物质数,以下也用此表示。
这道题的两个难点分别是输入和高斯消元。
先来讲我的读入方式,发现都是一个小数+一个物质,于是可以用先读小数再读$string$就好了,用$map$记录每种元素有没有出现过即可。
再将更复杂的高斯消元,发现方程数小于未知数的个数,但是我们没有必要求出这个未知数的具体大小。
我的方法好像不是正解,就是将行改为$n+1$,列改为$m+1$消元即可,最后答案就是$Map[n+1][m+1]$。
出题人说没有卡精度,但是我被卡精度了……
调了好长时间才过……
时间复杂度:$\Theta(n^3)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
struct rec{double a;string s;}e[210][210];
map<string,int> mp;
int n,m;
string str;
double Map[210][210],del;
double ans;
double gauss()
{
for(int i=1;i<=n;i++)
{
int flag=i;
for(int j=i+1;j<=n;j++)
if(fabs(Map[j][i])>fabs(Map[flag][i]))flag=j;
for(int j=1;j<=m+1;j++)
swap(Map[i][j],Map[flag][j]);
if(fabs(Map[i][i])<1e-8)continue;
double b=Map[i][i];
for(int j=i;j<=m+1;j++)Map[i][j]/=b;
for(int j=1;j<=n+1;j++)
{
if(j==i) continue;
double b=Map[j][i];
for(int k=i;k<=m+1;k++)
Map[j][k]-=Map[i][k]*b;
}
}
if(fabs(Map[n+1][m+1])<1e-8)return 0;
return -Map[n+1][m+1];
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n+1;i++)
{
int res=0,now=1;
while(1)
{
res++;
cin>>e[i][res].a>>e[i][res].s;
if(!mp[e[i][res].s])mp[e[i][res].s]=++m;
e[i][res].a*=now;
string str;cin>>str;
if(str[0]=='=')now=-1;
if(str[0]=='H')
{
if(i!=n+1)cin>>e[i][++res].a;
break;
}
}
}
for(int i=1;i<=n+1;i++)
{
int res=0;
while(!e[i][++res].s.empty())
Map[i][mp[e[i][res].s]]=e[i][res].a;
Map[i][m+1]=e[i][res].a;
}
printf("%.1lf",gauss());
return 0;
}
rp++
[CSP-S模拟测试]:炼金术士的疑惑(模拟+数学+高斯消元)的更多相关文章
- 6.10 省选模拟赛 小C的利是 高斯消元 矩阵行列式
LINK:小C的利是 想起来把这道题的题解写了 .一个常识:利是在广东那边叫做红包. 关于行列式的题目 不过我不太会23333..口胡还是可以的. 容易想到10分的状压.不过没什么意思. 仔细观察要求 ...
- 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)
A------------------------------------------------------------------------------------ 题目链接:http://20 ...
- NOIP 模拟 $18\; \rm 炼金术士的疑惑$
题解 \(by\;zj\varphi\) 高斯消元 根据高中化学知识,求解方程的就是一直方程凑出来的,焓值也一样 那么对于要求的方程和一直方程,我们做一次高斯消元,以每个物质为未知数,因为它保证有解, ...
- [CSP-S模拟测试]:表达式密码(模拟)
题目传送门(内部题87) 输入格式 从文件$expression.in$中读入数据.输入一行,一个字符串$S$,表示原表达式,保证为合法表达式 输出格式 输出到文件$expression.out$中. ...
- [CSP-S模拟测试]:天空龙(模拟)
题目描述 奥西里斯之天空龙很喜欢颜色,有一天他找到了三种颜色——红黄蓝.奥西里斯有$a$个红色,$b$个黄色,$c$个蓝色,他想用画出最好的画,可是需要至少$x$个红色,$y$个黄色和$z$个蓝色,似 ...
- [CSP-S模拟测试]:折纸(模拟)
题目描述 小$s$很喜欢折纸.有一天,他得到了一条很长的纸带,他把它从左向右均匀划分为$N$个单位长度,并且在每份的边界处分别标上数字$0\sim n$.然后小$s$开始无聊的折纸,每次他都会选择一个 ...
- [CSP-S模拟测试]:引子(大模拟)
题目描述 网上冲浪时,$Slavko$被冲到了水箱里,水箱由上而下竖直平面.示意图如下: 数字$i$所在的矩形代表一个编号为$i$的水箱.1号水箱为水箱中枢,有水管连出.除了$1$号水箱外,其他水箱上 ...
- [CSP-S模拟测试]:数学课(找规律+数学)
题目传送门(内部题145) 输入格式 从$math.in$读入数据. 第一行两个数,为$n,q$.接下来$q$行每行一个数$m$,询问大小为$m$的$A$一共有多少个. 输出格式 输出答案到$math ...
- [CSP-S模拟测试]:随(快速幂+数学)
题目描述 给出$n$个正整数$a_1,a_2...a_n$和一个质数mod.一个变量$x$初始为$1$.进行$m$次操作.每次在$n$个数中随机选一个$a_i$,然后$x=x\times a_i$.问 ...
随机推荐
- docker--docker 容器操作
6 docker 容器操作 容器是 docker 镜像的运行时实例. 6.1 创建容器 docker run [options] image command [ARG...]options选项: ‐i ...
- python虚拟环境virtualenv创建与迁移
1.安装virtualenv pip install virtualenv #(python2) pip3 install virtualenv #(python3) 2.创建venv virtual ...
- MySQL数据库的特点和优势
MySQL数据库的特点和优势: 1.MySQL性能卓越.服务稳定,很少出现异常宕机. 2.MySQL开放源代码且无版权制约,自主性及使用成本低. 3.MySQL历史悠久,用户使用活跃,遇到问题可以寻求 ...
- How to attach multiple files in the Send Mail Task in SSIS
Let’s say you need to create a SSIS package that creates 2 files and emails the files to someone. Yo ...
- 图——图的Kruskal法最小生成树实现
1,最小生成树的特征: 1,选取的边是图中权值较小的边: 2,所有边连接后不构成回路: 2,prim 算法是以顶点为核心的,最下生成树最大的特征是边,但 prim 算法非要以顶点为核心来进行,有些复杂 ...
- 实例学习——爬取豆瓣网TOP250数据
开发环境:(Windows)eclipse+pydev 网址:https://book.douban.com/top250?start=0 from lxml import etree #解析提取数据 ...
- 1、Java语言概述与开发环境——Java特性和技术体系平台
一.Java语言的主要特性 1.Java语言是易学的: Java语言的语法与C语言和C++语言很接近,使得大多数的程序员很容易学习和使用Java. 2.Java语言是强制面向对象的: Java语言提供 ...
- div绝对定位居中
绝对定位absolute,left:50%,加上margin-left:-(宽度/2),可以实现绝对位置居中 .list{ width: 1200px; height: 300px; overflow ...
- Redis---Redis与Memcached
4.Redis与Memcached 两者都是非关系型内存键值,主要有以下不同: 数据类型 Memcached仅支持字符串类型,而Redis支持五种不同的数据类型,可以更灵活地解决问题. 数据持 ...
- npm学习(一)之安装、更新以及管理npm版本
安装npm 安装前须知: npm是在Node中编写的,因此需要安装Node.js才能使用npm.可以通过Node.js网站安装npm,或者安装节点版本管理器NVM. 如果只是想开始探索npm,使用No ...