AcWing算法基础课笔记——高斯消元

高斯消元

用来求解方程组
a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 21 x 1 + a 22 x 2 + ⋯ + a 2 n x n = b 2 … a n 1 x 1 + a n 2 x 2 + ⋯ + a n n x n = b n a_{11} x_1 + a_{12} x_2 + \dots + a_{1n} x_n = b_1\\ a_{21} x_1 + a_{22} x_2 + \dots + a_{2n} x_n = b_2\\ \dots \\ a_{n1} x_1 + a_{n2} x_2 + \dots + a_{nn} x_n = b_n\\ a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2an1x1+an2x2++annxn=bn
输入是 n × ( n − 1 ) n \times (n -1 ) n×(n1)的矩阵。

对方程组进行以下三种初等行列变换后,方程的解不变:

  1. 把某一行乘以一个非零的数
  2. 交换某2行
  3. 把某行的若干倍加到另一行上去

因此,对任意一个方程组,可以把它变成倒三角形式:
a 11 x 1 + a 12 x 2 + ⋯ + a 1 n x n = b 1 a 22 x 2 + ⋯ + a 2 n x n = b 2 … a ( n − 1 ) ( n − 1 ) x n − 1 + a ( n − 1 ) n x n = b n − 1 a n n x n = b n a_{11}x_1 + a_{12}x_2+\dots +a_{1n}x_n = b_1 \\ a_{22}x_2 + \dots + a_{2n} x_n = b_2 \\ \dots \\ a_{(n-1)(n-1)}x_{n-1} +a_{(n-1)n}x_{n} = b_{n-1}\\ a_{nn}x_n = b_n a11x1+a12x2++a1nxn=b1a22x2++a2nxn=b2a(n1)(n1)xn1+a(n1)nxn=bn1annxn=bn
有三种情况:

  1. 完美阶梯型——唯一解
  2. 0 = 非零 ———无解
  3. 0 = 0 ——无穷多组解

高斯消元步骤:

枚举每一列c:

  1. 找到绝对值最大的一行
  2. 将该行换到最上面
  3. 将该行第一个数变成1
  4. 将下面所有行的第c列消成0

题目

详见:https://www.acwing.com/problem/content/description/885/

输入一个包含 n 个方程 n 个未知数的线性方程组。

方程组中的系数为实数。

求解这个方程组。

下图为一个包含 m 个方程 n 个未知数的线性方程组示例:

在这里插入图片描述

输入格式

第一行包含整数 n。

接下来 n 行,每行包含 n+1 个实数,表示一个方程的 n 个系数以及等号右侧的常数。

输出格式

如果给定线性方程组存在唯一解,则输出共 n 行,其中第 i 行输出第 i 个未知数的解,结果保留两位小数。

注意:本题有 SPJ,当输出结果为 0.00 时,输出 -0.00 也会判对。在数学中,一般没有正零或负零的概念,所以严格来说应当输出 0.00,但是考虑到本题作为一道模板题,考察点并不在于此,在此处卡住大多同学的代码没有太大意义,故增加 SPJ,对输出 -0.00 的代码也予以判对。

如果给定线性方程组存在无数解,则输出 Infinite group solutions

如果给定线性方程组无解,则输出 No solution

数据范围

1≤n≤100,
所有输入系数以及常数均保留两位小数,绝对值均不超过 100。

输入样例:
3
1.00 2.00 -1.00 -6.00
2.00 1.00 -3.00 -9.00
-1.00 -1.00 2.00 7.00
输出样例:
1.00
-2.00
3.00

代码

#include<iostream>
#include<algorithm>
#include<cmath>using namespace std;const int N = 110;
const double eps = 1e-6;int n;
double a[N][N];int gauss() {int c, r;for(c = 0, r = 0; c < n; c ++ ) {// 找到绝对值最大的一行 t int t = r;for(int i = r; i < n; i ++ ) {if(fabs(a[i][c]) > fabs(a[t][c])) {t = i;}}if(fabs(a[t][c]) < eps) continue; //如果第t行为0,结束//将该行换到最上面 for(int i = c; i <= n; i ++ ) swap(a[t][i], a[r][i]);  //将该行的第c位设为1(前面都为0) for(int i = n; i >= c; i --) a[r][i] /= a[r][c];//将下面所有行的第c列消成0//也就是从r + 1行开始,对于第i行,第i行第c个位置a[i][c]如果不为0的话,就要消成0// a[i][c]消成0 : a[i][c] -= a[r][c] * a[i][c]     a[r][c]为1// 那么其他所有列: a[i][j] -= a[r][j] * a[i][c]for(int i = r + 1; i < n; i ++ ) {if(fabs(a[i][c]) > eps) {for(int j = n; j >= c; j -- ) {a[i][j] -= a[r][j] * a[i][c];}}}r ++; }if(r < n) {for(int i = r; i < n; i ++ ) {if(fabs(a[i][n]) > eps)return 2; //无解 }return 1; //有无穷多组解 }//求解唯一解 //从第n - 1 行开始往上,遍历每一行//对于第i行,它的解是a[i][n]的值 for(int i = n - 1; i >= 0; i -- ) {for(int j = i + 1; j < n; j ++ ) {a[i][n] -= a[i][j] * a[j][n];}}return 0; //有唯一解 } int main() {cin >> n;for(int i = 0; i < n; i ++ ) {for(int j = 0; j <= n; j ++ ) {cin >> a[i][j];}}int t = gauss();if(t == 0) {for(int i = 0; i < n; i ++ ) printf("%.2lf\n", a[i][n]);}else if (t == 1) puts("Infinite group solutions");else puts("No solution");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 使用cmd wifi命令操作wifi

cmd wifi 命令完整的说明说下。 console:/ # cmd wifi Wi-Fi (wifi) commands:help or -hPrint this help text.get-country-codeGets country code as a two-letter stringset-wifi-enabled enabled|disabledEnables…

论文导读 | Manufacturing Service Operations Management近期文章精选

编者按 在本系列文章中&#xff0c;我们梳理了顶刊Manufacturing & Service Operations Management5月份发布有关OR/OM以及相关应用的文章之基本信息&#xff0c;旨在帮助读者快速洞察行业/学界最新动态。 推荐文章1 ● 题目&#xff1a;Robust Drone Delivery with Weath…

【C++题解】1712. 输出满足条件的整数2

问题&#xff1a;1712. 输出满足条件的整数2 类型&#xff1a;简单循环 题目描述&#xff1a; 有这样的三位数&#xff0c;其百位、十位、个位的数字之和为偶数&#xff0c;且百位大于十位&#xff0c;十位大于个位&#xff0c;请输出满所有满足条件的整数。 输入&#xff1…

#05搜索法

要点&#xff1a; ①搜索法&#xff1a;穷举搜索、深度优先搜索、广度优先搜索、广深结合搜索、回溯法、分支限界法&#xff1b; ②解空间树&#xff1a;子集树、排列树、满m叉树。 ③回溯法及分支限界法求解问题的方法与步骤。 难点&#xff1a; 子集树、排列树和满m叉树…

小程序下拉刷新,加载更多数据,移动端分页

文章目录 页面结构图WXML页面代码js代码wxss代码总结备注 参考&#xff1a;https://juejin.cn/post/7222855604406796346 页面结构图 一般页面就4个结构&#xff1a;最外滚动层、数据展示层、暂无数据层、没有更多数据层。 如图&#xff1a; WXML页面代码 <scroll-view …

前端:Vue中使用JS-Cookie

在我们构建Vue站点时候&#xff0c;可能需要使用 cookie 来记录用户信息或者偏好设置&#xff0c;我们可以引入第三方库 GitHub - js-cookie/js-cookie: A simple, lightweight JavaScript API for handling browser cookies 来方便地操作 cookie。接下来我们就来一步一步地实…

Golang | Leetcode Golang题解之第191题位1的个数

题目&#xff1a; 题解&#xff1a; func hammingWeight(num uint32) (ones int) {for ; num > 0; num & num - 1 {ones}return }

# Kafka_深入探秘者(5):kafka 分区

Kafka_深入探秘者&#xff08;5&#xff09;&#xff1a;kafka 分区 一、kafka 副本机制 1、Kafka 可以将主题划分为多个分区(Partition)&#xff0c;会根据分区规则选择把消息存储到哪个分区中&#xff0c;只要如果分区规则设置的合理&#xff0c;那么所有的消息将会被均匀的…

CesiumJS【Basic】- #014 Entity和Primitive的flyTo

文章目录 Entity和Primitive的flyTo1 目标2 实现2.1 实体对象定位2.2 图元对象定位Entity和Primitive的flyTo 1 目标 实体对象和图元对象定位 2 实现 2.1 实体对象定位 实体对象定位可以使用Cesium.Viewer的flyTo方法。由于target参数可以是一个Entity,所以直接调用即可。…

Golang | Leetcode Golang题解之第198题打家劫舍

题目&#xff1a; 题解&#xff1a; func rob(nums []int) int {if len(nums) 0 {return 0}if len(nums) 1 {return nums[0]}first : nums[0]second : max(nums[0], nums[1])for i : 2; i < len(nums); i {first, second second, max(first nums[i], second)}return se…

【Android面试八股文】WebView如何做资源缓存的?

文章目录 引言1. Android WebView的性能问题1.1 H5页面加载速度慢1.1.1 渲染速度慢1.1.2 页面资源加载缓慢1.1.3 总结1.2 耗费流量1.3 总结2. 上述问题的解决方案2.1 前端H5的缓存机制2.1.1 定义2.1.2 作用2.1.3 具体应用2.2 缓存机制2.2.1 浏览器缓存机制 (HTTP Cache)原理特点…

whisper 实现语音转文字

准备需要转码的音频 https://support.huaweicloud.com/sdkreference-sis/sis_05_0039.html 编码转吗的代码 import whisperif __name__ "__main__":file_path "16k16bit.wav"model whisper.load_model("small")result model.transcribe(f…

掌握Vim的艺术:精通diff模式的比较与合并

标题&#xff1a;掌握Vim的艺术&#xff1a;精通diff模式的比较与合并 引言 在软件开发和文本编辑中&#xff0c;比较文件差异是一项常见任务。Vim&#xff0c;作为一款功能强大的文本编辑器&#xff0c;提供了一个内置的diff模式&#xff0c;使得文件比较变得直观和高效。本…

openEuler离线安装nginx

目录 1.创建储存目录 2.切换到储存目录 3.首先在外网的环境下下载nginx的rpm包 4.目录打包tar包拷贝到离线路径 5.安装nginx 6.启动 nginx 7.停止 nginx 8.重新加载 nginx 配置 9.重新启动 nginx&#xff08;先停止再启动 nginx&#xff09; 10.检查 nginx 服务…

【分布式系统】Zookeeper学习笔记

基本概念 Zookeeper工作机制 从设计模式角度理解: 是一个基于观察者模式设计的分布式服务管理框架; 负责存储和管理大家都关心的数据, 一旦这些数据的状态发生变化, Zookeeper就将负责通知已经在Zookeeper上注册的那些观察值做出相应的反应. Zookeeper特点 Zookeeper有: 一…

强化Linux系统安全:利用Tripwire防御文件完整性攻击

摘要 在日益复杂的网络安全环境中&#xff0c;保护Linux系统的文件完整性是维护系统安全的关键。Tripwire作为一种高效的文件完整性监控工具&#xff0c;能够帮助系统管理员检测和响应未授权的文件更改。本文将从网络安全专家的角度&#xff0c;指导如何部署和使用Tripwire&am…

QT中线程同步的互斥量QMutex与QRecursiveMutex

在 Qt 中&#xff0c;有两种常用的互斥量类&#xff1a;QMutex 和 QRecursiveMutex。这两种互斥量类都用于在多线程环境中控制对共享资源的访问&#xff0c;确保线程安全性。下面是关于这两种互斥量类的详细说明&#xff1a; 1. QMutex&#xff1a; 功能&#xff1a;QMutex 是…

EdgeOne 边缘函数 + Hono.js + Fauna 搭建个人博客

一、背景 虽然 “博客” 已经是很多很多年前流行的东西了&#xff0c;但是时至今日&#xff0c;仍然有一部分人在维护自己的博客站点&#xff0c;输出不少高质量的文章。 我使用过几种博客托管平台或静态博客生成框架&#xff0c;前段时间使用Hono.jsFauna &#xff0c;基于 …

STM32教程 使用硬件SPI和模拟SPI驱动W25Q64芯片

STM32教程&#xff1a;使用硬件SPI和模拟SPI驱动W25Q64芯片 摘要 本教程详细介绍了如何在STM32微控制器上使用硬件SPI和模拟SPI来驱动W25Q64 Flash存储器。W25Q64是一款8Mbit的串行Flash存储器&#xff0c;适用于存储程序数据和用户数据。本教程将从SPI基本原理讲起&#xff…

第 10 课:PPML入门/基于SPU机器学习建模实践

本讲主要内容是PPML入门&#xff0c;即基于SPU进行隐私保护的机器学习的建模实践。通过本次学习&#xff0c;可以了解隐私保护机器学习以及隐语SPU的架构&#xff0c;通过实战可以了解如何基于隐语进行隐私保护的NN模型建模。 一、隐私保护机器学习背景 机器学习中的数据隐私问…