洛谷P3389 【模板】高斯消元法
P3389 【模板】高斯消元法
题目背景
Gauss消元
题目描述
给定一个线性方程组,对其求解
输入输出格式
输入格式:
第一行,一个正整数 n
第二至 n+1行,每行 n+1 个整数,为a1,a2⋯an 和 b,代表一组方程。
输出格式:
共n行,每行一个数,第 i行为 xi (保留2位小数)
如果不存在唯一解,在第一行输出"No Solution".
输入输出样例
3
1 3 4 5
1 4 7 3
9 3 2 2
-0.97
5.18
-2.39
说明
1≤n≤100,∣ai∣≤104,∣b∣≤104
sol:究竟是什么东西(感觉像小学奥数)
我们首先确定一个方程组作为例子
x-2y+3z=6
4x-5y+6z=12
7x-8y+10z=21
先将它转化为矩阵
1 -2 3 6
4 -5 6 12
7 -8 10 21
解决这个方程组
我们会希望它变成如下形式
1 0 0 a
0 1 0 b
0 0 1 c
这样就可以表示为x=a,y=b,z=cx=a,y=b,z=c
我们使用高斯消元,就要一步一步将每个未知数约去。
这种方法是以列为单位消去的
首先我们将第一列转化为1 0 0的形式
在这里要注意一下,我们往往是将这个系数绝对值最大的方程转移到被减的这一行,这样就可以减小误差
所以我们先将矩阵变成这样
7 -8 10 21
4 -5 6 12
1 -2 3 6
然后将正在处理的方程式化简,让正被处理的系数化1
1 -8/7 10/7 3
4 -5 6 12
1 -2 3 6
然后使用加减法将第二个与第三个方程组的第一个系数化0
1 -8/7 10/7 3
0 -3/7 2/7 0
0 -6/7 11/7 3
然后这时候第一列就被化简完成
同理我们化去第二行与第三行,步骤如下:
1.化简第二行
1 -8/7 10/7 3
0 1 -2/3 0
0 -6/7 11/7 3
2.用第一行减第二行×(-8/7),第三行减第二行×(-6/7)
1 0 2/3 3
0 1 -2/3 0
0 0 1 3
3.不需要化简第三行,所以直接用第一行减去第三行×2/3,第二行减去第三行×(-2/3)
1 0 0 1
0 1 0 2
0 0 1 3
最后我们就得到了一组解x=1,y=2,y=3x=1,y=2,y=3。所以高斯消元其实是运用了小学解方程组的加减法的呢。
注意是一列列消去的
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll S=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
S=S*+(ch-''); ch=getchar();
}
return (f)?(-S):(S);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar(x%+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=;
const double eps=1e-;
int n;
double a[N][N];
inline bool Gauss()
{
int i,j,k;
for(i=;i<=n;i++)
{
k=i;
for(j=i+;j<=n;j++) if(fabs(a[j][i])>fabs(a[k][i])) k=j;
//找到最大的数
if(fabs(a[k][i])<eps) return false;
if(i!=k) for(j=i;j<=n+;j++) swap(a[k][j],a[i][j]);
//对换一行或一列,属于找最大当前系数的其中一步.(这样就可以只处理当前行的系数啦!)
double Div=a[i][i];
for(j=i;j<=n+;j++) a[i][j]/=Div;
for(j=;j<=n;j++) if(j!=i)
{
Div=a[j][i];
for(k=i;k<=n+;k++)
{
a[j][k]-=a[i][k]*Div;
}
}
//把这列除这个数外都消成0
}
return true;
}
int main()
{
int i,j;
R(n);
for(i=;i<=n;i++)
{
for(j=;j<=n+;j++) scanf("%lf",&a[i][j]);
}
if(!(Gauss()))
{
puts("No Solution");
}
else
{
for(i=;i<=n;i++) printf("%.2lf\n",a[i][n+]);
}
return ;
}
/*
input
3
1 3 4 5
1 4 7 3
9 3 2 2
output
-0.97
5.18
-2.39
*/
附上更加符合上面教程的代码(完全按照上面写的)
#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=;
bool f=;
char ch=' ';
while(!isdigit(ch))
{
f|=(ch=='-'); ch=getchar();
}
while(isdigit(ch))
{
s=(s<<)+(s<<)+(ch^); ch=getchar();
}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<)
{
putchar('-'); x=-x;
}
if(x<)
{
putchar(x+''); return;
}
write(x/);
putchar((x%)+'');
return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const double eps=1e-;
const int N=;
int n;
double a[N][N],b[N];
inline void Debug()
{
int i,j;
for(i=;i<=n;i++)
{
for(j=;j<=n;j++) printf("%.2lf ",a[i][j]);
printf("%.2lf",b[i]);
puts("");
}
puts("");
}
inline void Gauss(int n)
{
int i,j,k;
double Div;
for(i=;i<=n;i++)
{
int Pos=i;
for(j=i+;j<=n;j++) if(fabs(a[Pos][i])<fabs(a[j][i])) Pos=j;
if(fabs(a[Pos][i])<eps)
{
puts("No Solution");
exit();
}
if(Pos!=i)
{
swap(a[i],a[Pos]); swap(b[i],b[Pos]);
}
Div=a[i][i];
for(j=i;j<=n;j++) a[i][j]/=Div; b[i]/=Div;
for(j=;j<=n;j++) if(j!=i)
{
Div=a[j][i];
for(k=i;k<=n;k++)
{
a[j][k]-=Div*a[i][k];
}
b[j]-=Div*b[i];
}
// Debug();
}
}
int main()
{
int i,j;
R(n);
for(i=;i<=n;i++)
{
for(j=;j<=n;j++) scanf("%lf",&a[i][j]); scanf("%lf",&b[i]);
}
Gauss(n);
for(i=;i<=n;i++) printf("%.2lf\n",b[i]);
return ;
}
/*
input
3
1 3 4 5
1 4 7 3
9 3 2 2
output
-0.97
5.18
-2.39
*/
洛谷P3389 【模板】高斯消元法的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
- LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)
为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...
- 【AC自动机】洛谷三道模板题
[题目链接] https://www.luogu.org/problem/P3808 [题意] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. [题解] 不再介绍基础知识了,就是裸的模 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 洛谷.1919.[模板]A*B Problem升级版(FFT)
题目链接:洛谷.BZOJ2179 //将乘数拆成 a0*10^n + a1*10^(n-1) + ... + a_n-1的形式 //可以发现多项式乘法就模拟了竖式乘法 所以用FFT即可 注意处理进位 ...
- 洛谷.3803.[模板]多项式乘法(FFT)
题目链接:洛谷.LOJ. FFT相关:快速傅里叶变换(FFT)详解.FFT总结.从多项式乘法到快速傅里叶变换. 5.4 又看了一遍,这个也不错. 2019.3.7 叕看了一遍,推荐这个. #inclu ...
- 洛谷.3803.[模板]多项式乘法(NTT)
题目链接:洛谷.LOJ. 为什么和那些差那么多啊.. 在这里记一下原根 Definition 阶 若\(a,p\)互质,且\(p>1\),我们称使\(a^n\equiv 1\ (mod\ p)\ ...
- 洛谷P3385 [模板]负环 [SPFA]
题目传送门 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个 ...
- [洛谷P3806] [模板] 点分治1
洛谷 P3806 传送门 这个点分治都不用减掉子树里的了,直接搞就行了. 注意第63行 if(qu[k]>=buf[j]) 不能不写,也不能写成>. 因为这个WA了半天...... 如果m ...
随机推荐
- Luogu P3378 【模板】堆
((^ 0.0 ^) )~ 堆是一个完全二叉树,对于小根堆,所有父节点<=子节点,下标就和线段树是一样的 在STL里就是优先队列 只有堆顶元素可以操作(询问或弹出). 加入新元素时x,he ...
- redis学习(二)——String数据类型
一.概述 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型的 ...
- Linux笔记-SIGHUP与daemon
参考资料:linux信号signal和sigaction理解 http://blog.csdn.net/beginning1126/article/details/8680757 signal,此函 ...
- 支持“xxxContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库
将项目的数据库连接用户及密码修改后(切换用户,用户名与原来不一样,用户下对象结构一致),报以下错误: 支持“XXXDBContext”上下文的模型已在数据库创建后发生更改.请考虑使用 Code Fir ...
- Insider Dev Tour(2018.06.28)
时间:2018.06.28地点:北京金茂万丽酒店
- 【Java并发.5】基础构建模块
本章会介绍一些最有用的并发构建模块,有丶东西(最后一小节,纯干货). 5.1 同步容器类 同步容器类包括 Vector 和 Hashtable ,这些类实现线程安全的方式是:将它们的状态封装起来,并对 ...
- Item 13: 比起iterator优先使用const_iterator
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 STL中的const_iterator等价于pointers-to ...
- React中嵌套组件与被嵌套组件的通信
前言 在React项目的开发中经常会遇到这样一个场景:嵌套组件与被嵌套组件的通信. 比如Tab组件啊,或者下拉框组件. 场景 这里应用一个最简单的Tab组件来呈现这个场景. import React, ...
- mybatis入门 配置文件解释 及测试
这里介绍一下mybatis 根据mybatis的官网说明,mybatis是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置 ...
- springboot 双数据源+aop动态切换
# springboot-double-dataspringboot-double-data 应用场景 项目需要同时连接两个不同的数据库A, B,并且它们都为主从架构,一台写库,多台读库. 多数据源 ...