题目传送门(内部题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模拟测试]:炼金术士的疑惑(模拟+数学+高斯消元)的更多相关文章

  1. 6.10 省选模拟赛 小C的利是 高斯消元 矩阵行列式

    LINK:小C的利是 想起来把这道题的题解写了 .一个常识:利是在广东那边叫做红包. 关于行列式的题目 不过我不太会23333..口胡还是可以的. 容易想到10分的状压.不过没什么意思. 仔细观察要求 ...

  2. 2017年中国大学生程序设计竞赛-中南地区赛暨第八届湘潭市大学生计算机程序设计大赛题解&源码(A.高斯消元,D,模拟,E,前缀和,F,LCS,H,Prim算法,I,胡搞,J,树状数组)

    A------------------------------------------------------------------------------------ 题目链接:http://20 ...

  3. NOIP 模拟 $18\; \rm 炼金术士的疑惑$

    题解 \(by\;zj\varphi\) 高斯消元 根据高中化学知识,求解方程的就是一直方程凑出来的,焓值也一样 那么对于要求的方程和一直方程,我们做一次高斯消元,以每个物质为未知数,因为它保证有解, ...

  4. [CSP-S模拟测试]:表达式密码(模拟)

    题目传送门(内部题87) 输入格式 从文件$expression.in$中读入数据.输入一行,一个字符串$S$,表示原表达式,保证为合法表达式 输出格式 输出到文件$expression.out$中. ...

  5. [CSP-S模拟测试]:天空龙(模拟)

    题目描述 奥西里斯之天空龙很喜欢颜色,有一天他找到了三种颜色——红黄蓝.奥西里斯有$a$个红色,$b$个黄色,$c$个蓝色,他想用画出最好的画,可是需要至少$x$个红色,$y$个黄色和$z$个蓝色,似 ...

  6. [CSP-S模拟测试]:折纸(模拟)

    题目描述 小$s$很喜欢折纸.有一天,他得到了一条很长的纸带,他把它从左向右均匀划分为$N$个单位长度,并且在每份的边界处分别标上数字$0\sim n$.然后小$s$开始无聊的折纸,每次他都会选择一个 ...

  7. [CSP-S模拟测试]:引子(大模拟)

    题目描述 网上冲浪时,$Slavko$被冲到了水箱里,水箱由上而下竖直平面.示意图如下: 数字$i$所在的矩形代表一个编号为$i$的水箱.1号水箱为水箱中枢,有水管连出.除了$1$号水箱外,其他水箱上 ...

  8. [CSP-S模拟测试]:数学课(找规律+数学)

    题目传送门(内部题145) 输入格式 从$math.in$读入数据. 第一行两个数,为$n,q$.接下来$q$行每行一个数$m$,询问大小为$m$的$A$一共有多少个. 输出格式 输出答案到$math ...

  9. [CSP-S模拟测试]:随(快速幂+数学)

    题目描述 给出$n$个正整数$a_1,a_2...a_n$和一个质数mod.一个变量$x$初始为$1$.进行$m$次操作.每次在$n$个数中随机选一个$a_i$,然后$x=x\times a_i$.问 ...

随机推荐

  1. 实验报告5&第七周课程总结

    实验四 类的继承 实验目的 理解抽象类与接口的使用: 了解包的作用,掌握包的设计方法. 实验要求 掌握使用抽象类的方法. 掌握使用系统接口的技术和创建自定义接口的方法. 了解 Java 系统包的结构. ...

  2. Java中字符编码和字符串所占字节数 .

    首 先,java中的一个char是2个字节.java采用unicode,2个字节来表示一个字符,这点与C语言中不同,C语言中采用ASCII,在大多数 系统中,一个char通常占1个字节,但是在0~12 ...

  3. Linux命令学习(0)

    作为一名前端,可能接触到linux的机会并不多,但这不代表就不需要学.对我而言,学习linux主要是为了方便部署我的项目到服务器,我并没有花时间去学这些,只是上网查怎么部署项目,然后按教程一步一步来, ...

  4. Python yield用法浅析(stackoverflow)

    这是stackoverflow上一个关于python中yield用法的帖子,这里翻译自投票最高的一个回答,原文链接 here 问题 Python中yield关键字的用途是什么?它有什么作用?例如,我试 ...

  5. thinkphp5 隐藏前台入口文件index.php 后台入口文件admin.php不隐藏

    情景:应用目录下有两个模块 admin(后台) 和 home(前台) 需求:1.访问前台(home)时隐藏index.php  即 域名/home/前台控制器/前台控制器里的方法 这样的访问模式 2. ...

  6. vue生命周期简单总结

    生命周期(钩子函数):一个组件从创建到销毁的过程就是生命周期     beforeCreate: 创建前     1.当前vue实例化的时候会做一个初始化的操作,在这个生命周期函数中我们可以做初始化的 ...

  7. java中的四种引用方式(强引用,软引用,弱引用,虚引用)

    java内存管理主要有内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java中对象的引用主要有四种:强引用,软引用,弱引用,虚引用. Java中提供这四种引 ...

  8. rabitMQ-centos7安装

    1.安装rabitMq之前需要安装Erlang cd /usr/local/ wget http://erlang.org/download/otp_src_18.3.tar.gz tar -zxvf ...

  9. jQuery进阶第二天(2019 10.10)

    一.事件流程 1.事件的三要素: 事件源:发生事件的对象 事件类型:类型比如单击.双击.鼠标的移入.移除 事件处理程序: 触发事件之后做些什么,事件处理的函数 <body> <but ...

  10. POJ 3741 Raid (平面最近点对)

    $ POJ~3741~Raid $ (平面最近点对) $ solution: $ 有两种点,现在求最近的平面点对.这是一道分治板子,但是当时还是想了很久,明明知道有最近平面点对,但还是觉得有点不对劲. ...