洛谷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 ...
随机推荐
- WPF之TextBox和PasswordBox水印效果
在博客园里看到了好多关于文本框和密码框水印效果的文章,今天有空也来实现一把,最终效果图如下: 文本框的话,稍微好一点直接可以绑定它的Text属性,因为他是个依赖属性,我用了二种方式来实现水印效果:触发 ...
- wpf、winform仿QQ靠边隐藏
先说下下面的代码和demo是wpf的,如果winform要用,改动不大的. 实现思路: 通过定时刷新鼠标位置 和 窗体坐标 进行计算 来控制窗体的隐藏 显示 代码都有详细的注释 //窗体状态 true ...
- 图解HTTP,TCP,IP,MAC的关系
入门 用户发了一个HTTP的请求,想要访问我们网站的首页,这个HTTP请求被放在一个TCP报文中,再被放到一个IP数据报中,最终的目的地就是我们的115.39.19.22. 进阶 IP数据报其实是通过 ...
- 分享一个公众号h5裂变吸粉源码工具
这次我是分享我本人制作的一个恶搞程序,说白了就是一个公众号裂变吸粉工具,市面上有很多引流方法,例如最常见的就是色流,哈哈,今天我跟大家分享的方法是有趣的,好玩的,恶搞的.这个程序上线一天已经收获了61 ...
- .net core实践系列之短信服务-目录
前言 经过两周多的业余时间,终于把该系列的文章写完了.第一次写系列,可能部分关键点并没有覆盖到,如果有疑问的朋友可以随时反馈给我.另外也感谢在我发布文章时给予我方案建议与反馈源码BUG的朋友们.下面是 ...
- vue中使用sass
1.npm安装 npm install sass-loader --save-dev npm install node-sass --save-dev //--save写入到package.json里 ...
- Python全栈开发之路 【第五篇】:Python基础之函数进阶(装饰器、生成器&迭代器)
本节内容 一.名称空间 又名name space,就是存放名字的地方.举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方. 名称空间共3种,分别如下 ...
- Python-爬虫小例子-55
import re from urllib.request import urlopen def getPage(url): response = urlopen(url) return respon ...
- AtCoder Beginner Contest 053
D - Card Eater Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement Snuke h ...
- XML 与 JSON大PK
导读 XML 和 JSON 是现今互联网中最常用的两种数据交换格式.XML 格式由 W3C 于 1996 年提出.JSON 格式由 Douglas Crockford 于 2002 年提出.虽然这两种 ...