NOIP 模拟 $18\; \rm 炼金术士的疑惑$
题解 \(by\;zj\varphi\)
高斯消元
根据高中化学知识,求解方程的就是一直方程凑出来的,焓值也一样
那么对于要求的方程和一直方程,我们做一次高斯消元,以每个物质为未知数,因为它保证有解,所以消完元后,求解方程的各项系数一定为 \(0\) 代表我们凑出这个方程了,最后答案就是求出来的值的相反数
读入时用 \(hash\) 和 \(map\) 都行,输出时要特判 \(0.0\)
Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
    char buf[1<<21],*p1=buf,*p2=buf;
    #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
    template<typename T>inline void read(T &x) {
        ri f=1;x=0;register char ch=getchar();
        while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=getchar();}
        while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
        x=f?x:-x;
    }
}
using IO::read;
namespace nanfeng{
    #define FI FILE *IN
    #define FO FILE *OUT
    template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
    template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
    typedef double db;
    static const int N=2e3+7;
    static const db eps=1e-8;
    map<string,db> mp[N],cl;
    int n,cnt;
    db H[N],mat[N][N],tmp;
    string ts,al[N];
    inline db Gauss() {
        for (ri i(1);i<=n&&i<=cnt;p(i)) {
            int k=i;
            for (ri j(i+1);j<=n;p(j))
                if (fabs(mat[k][i])<fabs(mat[j][i])) k=j;
            if (k!=i) swap(mat[k],mat[i]);
            for (ri j(1);j<=n+1;p(j)) {
                if (i==j) continue;
                db tp=mat[j][i]/mat[i][i];
                for (ri l(1);l<=cnt+1;p(l))
                    mat[j][l]-=mat[i][l]*tp;
            }
        }
        return -mat[n+1][cnt+1];
    }//高斯约旦
    inline int main() {
        // FI=freopen("nanfeng.in","r",stdin);
        // FO=freopen("nanfeng.out","w",stdout);
        read(n);
        for (ri i(1);i<=n+1;p(i)) {
            while(1) {
                scanf("%lf",&tmp);
                cin >> ts;
                if (ts[0]=='=') break;
                if (cl.find(ts)==cl.end()) {al[p(cnt)]=ts;cl[ts]=1.0;}
                mp[i][ts]=tmp;
                cin >> ts;
                if (ts[0]=='=') break;
            }
            while(1) {
                scanf("%lf",&tmp);
                cin >> ts;
                if (ts[0]=='H'&&ts[1]=='=') break;
                if (cl.find(ts)==cl.end()) {al[p(cnt)]=ts;cl[ts]=1.0;}
                mp[i][ts]=-tmp;
                cin >> ts;
                if (ts[0]=='H'&&ts[1]=='=') break;
            }
            if (i<=n) scanf("%lf",&H[i]);
        }
        for (ri i(1);i<=n+1;p(i)) {
            for (ri j(1);j<=cnt;p(j)) {
                if (mp[i].find(al[j])!=mp[i].end())
                    mat[i][j]=mp[i][al[j]];
            }
            if (i<=n) mat[i][cnt+1]=H[i];
        }
        db ans=Gauss();
        printf("%.1lf",fabs(ans)>eps?ans:0);
        return 0;
    }
}
int main() {return nanfeng::main();}
NOIP 模拟 $18\; \rm 炼金术士的疑惑$的更多相关文章
- NOIP 模拟 $18\; \rm 老司机的狂欢$
		
题解 \(by\;zj\varphi\) 一道很有趣的题,我用的动态开点线段树和倍增 首先对于第一问,不难想到要二分,二分时间,因为时间长一定不会比时间短能跑的人多 那么如何 check,先将所有老司 ...
 - NOIP 模拟 $18\; \rm 导弹袭击$
		
题解 \(by\;zj\varphi\) 一道凸包题 对于每个导弹,它的飞行时间就是 \(tim=\frac{A}{a_i}+\frac{B}{b_i}\) 我们设 \(x=\frac{1}{a_i} ...
 - Noip模拟18 2021.7.17 (文化课专场)
		
T1 导弹袭击(数学) 显然,我们要找到最优的A,B使得一组a,b优于其他组那么可以列出: $\frac{A}{a_i}+\frac{B}{b_i}<\frac{A}{a_j}+\frac{B} ...
 - [CSP-S模拟测试]:炼金术士的疑惑(模拟+数学+高斯消元)
		
题目传送门(内部题70) 输入格式 第一行一个正整数$n$,表示炼金术士已知的热化学方程式数量.接下来$n$行,每行一个炼金术士已知的热化学方程式.最后一行一个炼金术士想要求解的热化学方程式,末尾记为 ...
 - noip模拟18
		
\(\color{white}{\mathbb{曲径通幽,星汉隐约,缥缈灯影,朦胧缺月,名之以:薄雾}}\) 放眼望去前十被我弃掉的 \(t2\) 基本都上85了-- 开考就以为 \(t2\) 是个大 ...
 - NOIP模拟 1
		
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
 - 20190902+0903合集-NOIP模拟
		
一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口 ...
 - 2021.5.22 noip模拟1
		
这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...
 - 软件开发 [CJOJ 1101] [NOIP 模拟]
		
Description 一个软件开发公司同时要开发两个软件,并且要同时交付给用户,现在公司为了尽快完成这一任务,将每个软件划分成m个模块,由公司里的技术人员分工完成,每个技术人员完成同一软件的不同模块 ...
 
随机推荐
- 报错处理:end Kernel panic - not syncing: Out of memory and no killable processes
			
报错如下: end Kernel panic - not syncing: Out of memory and no killable processes [ 2.113892] [<fffff ...
 - Linux | 压缩与解压详解
			
tar tar 命令用于对文件进行打包压缩或解压,格式: tar [选项][文件] tar命令的参数及其作用 参数 作用 -c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -z 用 ...
 - Selenium自动化测试框架Ride使用XLRD对于Excel测试数据的管理和操作
			
Python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库. 一.安装xlrd模块 到python官网下载http://pypi.pytho ...
 - java编译通过,运行却提示找不到或无法加载主类
			
问题: HelloWorld.java 1 package myP101; 2 3 public class HelloWorld { 4 public static void main(String ...
 - Java程序设计当堂测试感受
			
开学第一周的周四,按照王主任的安排,进行了Java当堂测试,来检测暑假八周的学习成果.这一堂课真是让我哭笑不得,这一节课三个小时都在写代码,感觉暑假学的一点点代码什么都不是,写一个系统都完不成,感觉自 ...
 - react-router 基本使用
			
# 1. 理解react-router react的一个插件库 专门用来实现一个SPA应用 基于react的项目基本都会用到此库 # 2. 几个重要问题## 1). SPA应用 单页Web应用(sin ...
 - C语言变量为何先定义后使用
			
C语言中,对变量的使用,首先要先定义.说明其数据类型.原因可能如下: 1不同类型的变量,其编码表示方式可能不同. 2不同类型的变量,其占有的空间大小不同.不事先说明无法在内存中开辟空间.
 - PAT乙级:1092 最好吃的月饼 (20分)
			
PAT乙级:1092 最好吃的月饼 (20分) 题干 月饼是久负盛名的中国传统糕点之一,自唐朝以来,已经发展出几百品种. 若想评比出一种"最好吃"的月饼,那势必在吃货界引发一场腥风 ...
 - []*T *[]T *[]*T 傻傻分不清楚
			
前言 作为一个 Go 语言新手,看到一切"诡异"的代码都会感到好奇:比如我最近看到的几个方法:伪代码如下: func FindA() ([]*T,error) { } func F ...
 - 大数据学习(18)—— Flume介绍
			
老规矩,学习新东西先上官网瞅瞅Apache Flume Flume是什么 Flume是一个分布式.可靠的大规模高效日志收集.汇聚和传输的这么一个服务.它的架构基于流式数据,配置简单灵活.它具备可调节的 ...