高斯消元(洛谷P3389)

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

简介

数学上,高斯消元法,是线性代数规划中的一个算法,可用来为线性方程组求解。常用于加减消元法,求出矩阵的秩,以及求出可逆方阵的逆矩阵。

实现

其实高斯消元就是模拟手算方程组的过程。

手算方程组最常用的两种方法:加减消元和代入消元。不断消元直到解出一个元,再不断回代解出其他元。

高斯消元法则是通过不断加减消元解出一个元再回代回去。

举个例子

比如下面这个方程组:

x+y+z2x+3yzx2y+2z=6=5=3(1) (1) { x + y + z = 6 ① 2 x + 3 y − z = 5 ② x − 2 y + 2 z = 3 ③

我们用矩阵来表示:
x121y132z111w650 [ x y z w 1 1 1 6 2 3 − 1 5 1 − 2 1 0 ]

现在我们消去 x x

×2 ②得  y+3z=7   − y + 3 z = 7 ②

③得 3yz=3


x100y113z131w673 [ x y z w 1 1 1 6 0 − 1 3 7 0 3 − 1 3 ]

再消去 y y

×3+ ③得 8z=24 8 z = 24 ③


x100y110z138w6724 [ x y z w 1 1 1 6 0 − 1 3 7 0 0 8 24 ]

这时候我们就解出了, z z 然后回代到②解出y,再回代到①解出 x x ,这个方程组就解完了。

特殊情况

解方程的时候有时会遇到无解/多解的情况。

当方程组无解时,表现为消元时有一行所有系数都为0,但常数项不为0。

当方程组多解时,表现为消元时有一行所有系数都为0,且常数项也为0。有几行这种情况就说明有几个元的值可以随便取。

代码

洛谷P3389为例:

因为在实际求解过程中会有实数存在,所以我们每次消元的时候选择系数最大的那一个,这样可以减少精度误差。

这道题没有无解的情况。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 105
#define eps 1e-8
using namespace std;
typedef double DB;
int n;
DB a[N][N],ans[N];
#define abs(x) ((x)<0?-(x):(x))
int main(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n+1;j++)
            scanf("%lf",&a[i][j]);
    for (int i=1,x=1;i<=n;x=++i){//消元
        for (int j=i+1;j<=n;j++)
            if (abs(a[j][i])>abs(a[x][i])) x=j;
        if (abs(a[x][i])<eps) return puts("No Solution"),0;
        if (i!=x) swap(a[i],a[x]); DB d=a[i][i];
        for (int j=i;j<=n+1;j++) a[i][j]/=d;
        for (int j=i+1;j<=n;j++){
            d=a[j][i];
            for (int k=i;k<=n+1;k++)
                a[j][k]-=a[i][k]*d;
        }
    }
    for (int i=n;i;i--){//回代
        ans[i]=a[i][n+1];
        for (int j=i+1;j<=n;j++)
            ans[i]-=a[i][j]*ans[j];
    }
    for (int i=1;i<=n;i++)
        printf("%.2f\n",ans[i]);
    return 0;
}
从BSCAN到BAP:深度解析Tessent MBIST逻辑的协同工作机制与设计考量 本文深入解析了Tessent MBIST逻辑中BSCAN Interface、Logic Group Def、Controller与BAP模块的协同工作机制。文章以一条测试指令的完整路径为例,详细阐述了数据流与控制流如何跨模块、跨时钟域协同工作,并重点探讨了MBIST BAP在协议转换与流量管理中的核心桥梁作用,为芯片内建自测试的集成与调试提供了关键的设计考量和实战技巧。 阅读详情

相关推荐

离线路径规划服务Graphhopper

离线路径规划服务Graphhopper 本文主要探索使用Graphhopper搭建离线路径规划服务,需要掌握一定的JAVA基础环境配置的知识 文章目录离线路径规划服务Graphhopper前言一、Graphhopper是什么?二、使用步骤1.下载Graphhopper2.从OpenStreetMap下载路图数据3.安装Graphhopper所需环境4.修改配置5.启动Graphhopper总结 前言 在外网环境中可以使用百度、高德等第三方的sdk用以实现路径规划的功能,由于项目的需要,在离线环境中需要使

Sysdark的博客 7524

洛谷P3389高斯消元法

高斯消元法是一个求解线性方程-&gt;n一次方程组的解法,就是通过一些式子的加减来消掉一些未知数,来达到求解的过程,高斯消元法一般只考虑系数,也就是说数组中只存着各个未知数的系数,通过一些操作,使得最后的系数矩阵成为一个对角线的左下方全是0的矩阵1  1  1  1  1  |  70  1  1  1  1  |  60  0  1  1  1  |  50  0  0  1  1  |  4...

AcerMoOi之路 488

保姆级教程:用SNAP处理哨兵一号数据,5步搞定城区范围提取(附江西晋城案例)

本文提供了一份详细的保姆级教程,介绍如何使用SNAP软件处理哨兵一号数据,通过5个关键步骤快速提取城区范围。以江西晋城为例,教程涵盖数据准备、预处理、核心处理流程、自动化搭建及成果分析,帮助用户轻松掌握SNAP操作技巧,适用于城市规划、环境监测等领域。

weixin_32535389的博客 424

洛谷 P3389高斯消元法【模板】【数论】

解题思路 所以第i个未知数(在第i列)最后只能在第i行有系数,其他行第i列的系数都被消成了0。 在这里要注意一下,我们往往是将第i个未知数系数绝对值最大的方程移到第i行,这样就可以减小误差。(证明不会啊哈哈哈) 所以我们先将矩阵变成这样: 接着在处理第iii个未知数时,我们以第i个式子作为主,用主式去消其他式子第i列的系数并更新i+1i+1i+1~ n+1n+1n+1列其他未知数的系数。(111~ i−1i-1i−1的已经被消成000了,第n+1n+1n+1列的是每个等式右边的答案) 那怎么...

在人间贩卖声音 244

洛谷 P3389:[模板] 高斯消元法 ← 高斯-约旦消法(Gauss-Jordan Elimination)

高斯消元法(Gaussian Elimination)​ 是一种用于求解线性方程组的经典算法,也是线性代数中最基础的工具之一。它通过一系列初等变换,将增广矩阵化为行阶梯形矩阵或行最简形矩阵,从而求出方程组的解。

hnjzsyjyj的专栏 207

洛谷P3389 【模板】高斯消元法

题目背景Gauss消题目描述给定一个线性方程组,对其求解输入输出格式输入格式:第一行,一个正整数 nn第二至 n+1n+1 行,每行 n+1n+1 个整数,为 a_1, a_2 \cdots a_na1​,a2​⋯an​ 和 bb ,代表一组方程。输出格式:共n行,每行一个数,第 ii 行为 x_ixi​ (保留2位小数)如果不存在唯一解,在第一行输出"No Solution".输入输出样例输入...

zhouhongkai06的博客 300

洛谷P4708】画画(Burnside)(高斯消)(并查集)

传送门 题解: 首先遇到这种图同构问题数据范围还小得一批的,还是先考虑暴力枚举有序正整数拆分,算出某种置换下的答案后来搞一波。 注意到题目要求的实际上是每个连通块都有欧拉回路,也就是所有点的度数必须是偶数。 可以直接用最小表示法来表示循环,然后爆搜所有边等价类对点的度数的影响。然后高斯消解xor方程组算方案数就行了。 但是高斯消上界是O(n4)O(n^4)O(n4),最坏是O(n2)O(n^...

zxyoi_dreamer的博客(不定期诈尸) 426

洛谷P3389】【模板】高斯消元法高斯消

题目大意: 题目链接:https://www.luogu.org/problem/P3389 给出nnn一次方程组,若有唯一解则输出解。 思路: 高斯消模板题。 代码: #include <cmath> #include <cstdio> #include <algorithm> using namespace std; const int N=110...

stoorz 215

【线性代数入门 | 那忘算 8】洛谷 P3389 高斯消(内附行列式教学)

感觉身体被掏空。

Isaac Regulus的博客 1078

【模板】高斯消洛谷P3389

#include<bits/stdc++.h> #define mem(x) memset(x,0,sizeof(x)) using namespace std; typedef long long ll; const ll maxn=1e3+10; const ll mod=1e9+7; const ll inf=0x7f7f7f7f; const double eps=1e-10; template<typename T>void read(T &x) { x =

STL_CC的博客 302

高斯消-洛谷模板题P3389

题目大意: 给你n个方程的系数(即n×(n+1)n \times (n+1)(n+1)的矩阵),让你求每个数的解. n≤100n \leq 100n≤100 算法:高斯消 思想: 先用一个式子EEE将其他式子中的一个未知数xxx给消掉.那么其他式子就与xxx无关了。 这个时候,忽略掉EEE的存在,剩下的式子少了一个未知数xxx并且仍然符合子问题.继续求解直到只剩下一个只含一个未知数的式子(即一个解).然后将这个解一个一个回代到其他式子中即可得到所有解。 具体在编程实现的时候,选择绝对值最大的系数作为式

qq_35577488的博客 332

洛谷_P3389 【模板】高斯消元法_高斯消

洛谷_P3389 【模板】高斯消元法_高斯消

这题AC再睡 332

高斯消洛谷P3389 高斯消

链接 https://www.luogu.org/problemnew/show/P3389 大意 求解一个nnn一次线性方程 思路 高斯消 (说白了就是用计算机模拟加减消) 代码 #include&lt;cstdio&gt; #include&lt;cmath&gt; #define r(i,a,b) for(register int i=a;i...

Ajwallet 332

洛谷-P3389-高斯消模板

链接: https://www.luogu.org/problem/P3389 题意: 给定一个线性方程组,对其求解 思路: 高斯消,从第一项消到最后一项,消成一个上三角矩阵.再从最后一项依次向上回带. 在消每一项的时候找到系数最大的一项开始消,将其系数置位1,再向下消,具体做法百度太多了. 代码: #include <bits/stdc++.h> using namesp...

weixin_30294021的博客 97

洛谷 P3389 高斯消模板题

高斯消模板(求多一次线性方程的解)

syyer 313

洛谷P3389】【模板】高斯消

题目链接 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数n 第二至n+1行,每行n+1个整数,为a1, a2.....an​和b,代表一组方程。 输出格式: 共n行,每行一个数,第i行为xi​(保留2位小数) 如果不存在唯一解,在第一行输出"No Solution". 输入输出样例 输入样例#1: 3 ...

weixin_30399797的博客 87

洛谷 P3389高斯消元法高斯消模板)

传送门~ 解题思路 留着自己看的高斯消模板。 代码: #include #include #include #include #include #include #include using namespace std; const double eps=1e-8; double f[110][110]; int n; void gauss(){ for(int i=1;

ldxxx的博客 462

洛谷P3389 【模板】高斯消 高斯-约旦消

复习的时候又翻了翻题解,发现了这个科技,挺NB的。 普通的高斯消的思路是把一行的某一项系数变为1,然后用这个对未操作的等式的这一项消去。 于是,进行消去后的形式变成了这样(a,b,c,d是常数,x,y,z是未知数): ∣a1xb1yc1z=d10b2yc2z=d200c3z=d3∣\begin{vmatrix}a_1x & b_1y &c_1z = d_1 \\ 0 &...

qq_38253946的博客 303

洛谷 - P3389 【模板】高斯消元法(高斯消解方程)

题目链接:点击查看 题目大意:给出一个线性方程组,求解答案 题目分析:模板题,挂个模板,时间复杂度是 O( n^3 ) 的,其中 a[ 1][ 1 ] ~ a[ n ][ n ] 矩阵代表 x[ 1 ] ~ x[ n ] 在每个方程中的系数,a[ 1 ][ n + 1 ] ~ a[ n ][ n + 1 ] 代表的是等号右边的 b 代码: #include<iostream> #include<cstdio> #include<string> #inclu..

Falcon的博客 461
上一篇: BZOJ1103: [POI2007]大都市meg(洛谷P3459)
下一篇: BZOJ2705: [SDOI2012]Longge的问题
forezxl
博客等级 码龄9年 34粉丝 459原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值