一、传送门

https://www.luogu.com.cn/problem/P3389
https://www.luogu.com.cn/problem/P2455

二、代码

日……两道题合起来搞了我十几个小时,最后把我气得从别人的 AC 代码开始再一句一句改成适配自己模板的同义的语句。
有些细节还是不太懂,暂时先把模板放上来。以后有时间再出详解。
————————————————————————————————————————————————————
高斯消元函数 gauss_elim() 的返回值:
0,唯一解;1,格式错(矩阵不是n行×(n+1)列);2,无数解;3,无解。
————————————————————————————————————————————————————
P3389:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdint>
#include<vector>
#pragma warning(disable:4996)
using namespace std;
template<class _Ty = double> class matrix {private:vector<vector<_Ty>> m; size_t row, col, _size;
public:matrix() { row = col = _size = 0; }matrix(const size_t& r, const size_t& c) { init(r, c); }virtual ~matrix() { del(); }void clear() { fill(m[0], m[0] + _size, 0); }void del() { m.resize(0); }void init(const size_t& r, const size_t& c) {row = r; col = c; _size = row * col; m.resize(r); for (size_t i = 0; i != r; ++i)m[i].resize(c);}void resize(const size_t& r, const size_t& c) const { del(); init(r, c); }void resize_directly(const size_t& r, const size_t& c) { row = r; col = c; _size = row * col; }size_t _row() const { return row; }size_t _col() const { return col; }size_t size() const { return _size; }void row_mul(const size_t& row, const _Ty& val) {for (size_t i = 0; i != col; ++i)m[row][i] *= val;}void row_mul_add_to(const size_t& rs, const _Ty& val, const size_t& rd) {for (size_t i = 0; i != col; ++i)m[rd][i] += m[rs][i] * val;}void interchange(const size_t& r1, const size_t& r2) { swap(m[r1], m[r2]); }vector<_Ty>& operator[](const size_t& r) { return m.at(r); }const vector<_Ty>& operator[](const size_t& r) const { return m.at(r); }
};
template<class _Ty = double> inline unsigned gauss_elim(matrix<_Ty>& a, _Ty* const x) {_Ty y, b; size_t n = a._row(), p, c; bool inf = false;for (size_t i = 0; i < n; ++i) {p = i; b = abs(a[p][i]);for (size_t j = i + 1; j < n; ++j)if (abs(a[j][i]) > b) { p = j; }if (p != i)a.interchange(p, i);if (a[i][i] == 0)continue;b = 1 / a[i][i];for (size_t j = 0; j < i; ++j)a.row_mul_add_to(i, -a[j][i] * b, j);for (size_t j = i + 1; j < n; ++j)a.row_mul_add_to(i, -a[j][i] * b, j);}for (size_t i = 0; i < n; ++i) {c = 0;for (size_t j = 0; j <= n; ++j) { if (a[i][j] == 0)++c; }if (c == n && a[i][n]) { return 3; }if (c == a._col()) { inf = true; }}if (inf)return 2;for (size_t i = n - 1; i != SIZE_MAX; --i) {y = a[i][n]; for (size_t j = n - 1; j > i; --j) { y -= a[i][j] * x[j]; }x[i] = y / a[i][i];}return 0;
}
matrix<double> m; size_t n; double x[100];
int main() {scanf("%llu", &n); m.init(n, n + 1);for (size_t i = 0; i < n; ++i)for (size_t j = 0; j <= n; ++j)scanf("%lf", &m[i][j]);if (!gauss_elim(m, x))for (size_t i = 0; i < n; ++i)printf("%.2lf\n", x[i]);else puts("No Solution");return 0;
}

P2455:

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdint>
#include<vector>
#pragma warning(disable:4996)
using namespace std;
template<class _Ty = double> class matrix {private:vector<vector<_Ty>> m; size_t row, col, _size;
public:matrix() { row = col = _size = 0; }matrix(const size_t& r, const size_t& c) { init(r, c); }virtual ~matrix() { del(); }void clear() { fill(m[0], m[0] + _size, 0); }void del() { m.resize(0); }void init(const size_t& r, const size_t& c) {row = r; col = c; _size = row * col; m.resize(r); for (size_t i = 0; i != r; ++i)m[i].resize(c);}void resize(const size_t& r, const size_t& c) const { del(); init(r, c); }void resize_directly(const size_t& r, const size_t& c) { row = r; col = c; _size = row * col; }size_t _row() const { return row; }size_t _col() const { return col; }size_t size() const { return _size; }void row_mul(const size_t& row, const _Ty& val) { for (size_t i = 0; i != col; ++i)m[row][i] *= val; }void row_mul_add_to(const size_t& rs, const _Ty& val, const size_t& rd) {for (size_t i = 0; i != col; ++i)m[rd][i] += m[rs][i] * val;}void interchange(const size_t& r1, const size_t& r2) { swap(m[r1], m[r2]); }vector<_Ty>& operator[](const size_t& r) { return m.at(r); }const vector<_Ty>& operator[](const size_t& r) const { return m.at(r); }
};
template<class _Ty = double> inline unsigned gauss_elim(matrix<_Ty>& a, _Ty* const x) {_Ty y, b; size_t n = a._row(), p, c; bool inf = false;for (size_t i = 0; i < n; ++i) {p = i; b = abs(a[p][i]);for (size_t j = i + 1; j < n; ++j)if (abs(a[j][i]) > b) { p = j; }if (p != i)a.interchange(p, i);if (a[i][i] == 0)continue;b = 1 / a[i][i];for (size_t j = 0; j < i; ++j)a.row_mul_add_to(i, -a[j][i] * b, j);for (size_t j = i + 1; j < n; ++j)a.row_mul_add_to(i, -a[j][i] * b, j);}for (size_t i = 0; i < n; ++i) {c = 0;for (size_t j = 0; j <= n; ++j) { if (a[i][j] == 0)++c; }if (c == n && a[i][n]) { return 3; }if (c == a._col()) { inf = true; }}if (inf)return 2;for (size_t i = n - 1; i != SIZE_MAX; --i) {y = a[i][n]; for (size_t j = n - 1; j > i; --j) { y -= a[i][j] * x[j]; }x[i] = y / a[i][i];}return 0;
}
matrix<double> m; size_t n; double x[50];
int main() {scanf("%llu", &n); m.init(n, n + 1);for (size_t i = 0; i < n; ++i)for (size_t j = 0; j <= n; ++j)scanf("%lf", &m[i][j]);switch (gauss_elim(m, x)) {case 3:puts("-1"); return 0;case 2:puts("0"); return 0;default:for (size_t i = 0; i < n; ++i)printf("x%llu=%.2lf\n", i + 1, x[i]); return 0;}
}

洛谷 P3389 【模板】高斯消元法 × 洛谷 P2455 [SDOI2006]线性方程组相关推荐

  1. 洛谷P2455 [SDOI2006]线性方程组

    高斯消元模板 要求输出解的情况(无穷解/无解) 1. 之前写的丑陋代码 #include <iostream> #include <cstdio> #include <c ...

  2. P2455 [SDOI2006]线性方程组

    题目链接:点击这里 题目大意: 给定一个线性方程组,对其求解 题目分析: 高斯-约旦消元法 选择一个尚未被选过的未知数作为主元,选择一个包含这个主元的方程 通过加减消元,消掉其它方程中的这个未知数 重 ...

  3. 【luogu P2455 [SDOI2006]线性方程组】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2455 无解:最后一列对应元素不为0,前面全是0. 无穷解:一行全是0. 嗯...在消元过程中不要直接拿矩阵元 ...

  4. 角谷猜想:所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 3 加 1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到 1。如假定初始整数为 5,计算过程分别为 16、

    角谷猜想 Description 所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘 3 加 1,如果是偶数,则除以2,得到的结果再按照上述规则重复处理,最终总能够得到 1.如,假定初始整数为 5 ...

  5. 阿米洛键盘失灵_阿米洛 海韵评测:可爱的键帽,强大的轴型,少女心十足!...

    今日话题:阿米洛 海韵评测:可爱的键帽,强大的轴型,少女心十足! 前几天小编在网上发现一款非常好看的阿米洛键盘,大家都知道阿米洛键盘的外观在所有机械键盘中可谓是做的最好的几种之一.所以小编今天就给大家 ...

  6. 剑灵双线西洛区服务器位置,剑灵西洛区将开启 西洛新的挑战福利等你来参与...

    原标题:剑灵西洛区将开启 西洛新的挑战福利等你来参与 为了迎接 剑灵全新大区西洛区1月17日开启,官方为玩家准备了海量升级签到福利.那么 剑灵西洛新的挑战福利有哪些?下面就来看看剑灵西洛新的挑战福利介 ...

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

    题目链接:点击查看 题目大意:给出一个线性方程组,求解答案 题目分析:模板题,挂个模板,时间复杂度是 O( n^3 ) 的,其中 a[ 1 ][ 1 ] ~ a[ n ][ n ] 矩阵代表 x[ 1 ...

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

    传送门 1 //minamoto 2 #include<iostream> 3 #include<cstdio> 4 #include<cmath> 5 using ...

  9. 【洛谷P3389】【模板】高斯消元

    题目链接 题目描述 给定一个线性方程组,对其求解 输入输出格式 输入格式: 第一行,一个正整数 n 第二至 n+1行,每行 n+1 个整数,为a1, a2 .....an​ 和 b,代表一组方程. 输 ...

最新文章

  1. k8s使用kube-router网络插件并监控流量状态
  2. hamming weight_popcount或者hamming weight(二进制1的个数问题)
  3. 01.query的分类-条件查询和组合查询
  4. 编写一个程序,实现将存放在AX和DX中的32位数据循环右移二进制数的4位。(DX存放高字节内容,AX存放低字节内容)
  5. java第五章课后题_黑猴子的家:Java SE 练习题第五章
  6. ng-model和ng-bind之间有什么区别
  7. 3.6 SQL Server 内存
  8. python语言月份缩写_Python替换月份为英文缩写的实现方法
  9. 使用虹软SDK实现离线人脸识别(局域网)
  10. 超级干货 :一文总览数据科学全景:定律、算法、问题类型...
  11. 在 boot 操作过程中的 FIRST_BOOT阶段,安装失败,出现错误
  12. Origin使用自定义函数拟合曲线函数
  13. 勋章菊的养殖方法和注意事项
  14. WeChat 聊天记录从一台手机转移到另外一台手机的注意事项
  15. 子网掩码的作用和用法
  16. 音视频技术开发周刊 | 248
  17. Windows记录ping时间戳
  18. ROS IDE —— RoboWare Studio
  19. VB.NET连接数据库的几种方法
  20. Java程序的类体两部分_一般Java程序的类体由两部分组成:一部分是____,另一部分是____。...

热门文章

  1. Hibernate-------一对一------(外键)配置和主键配置
  2. 中国电信4g最快服务器IP,中国电信DNS IP地址大全(32个省)
  3. 【雕爷学编程】Arduino动手做(86)---4*4位 WS2812 全彩模块
  4. 用半年的时间面试自己
  5. linux vim go语言,CentOS7系统基于Vim8搭建Go语言开发环境
  6. csgo服务器性能要求,CSGO服务器怎么选择合适的配置?CSGO服务器如何选择系统?...
  7. 计算机理论基础知识书面形式,计算机基础知识word.doc
  8. ModelAndView: materialized View is [null];和Action的onSubmit()方法不被执行
  9. CSS中margin属性详解
  10. 收藏:国内的12个安全漏洞预警渠道