题解 P3389 【【模板】高斯消元法】

看到大家都没有重载运算符,那我就重载一下运算符给大家娱乐一下

我使用的是高斯-约旦消元法,这种方法是精度最高的(相对地)

一句话解释高斯约旦消元法:

通过加减消元法,依次制定x0,并通过加减消元法消去其他方程的x0的系数。对于这样的系数矩阵我们只进行初等变幻保证了其正确性

看代码吧,主要是希望帮助大家可以学到一些重载的方法

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
inline int qr(void){
char c=getchar();
int x=0,q=1;
while(c<48||c>57)
q=c==45?-1:q,c=getchar();
while(c>=48&&c<=57)
x=(x<<1)+(x<<3)+(c^48),c=getchar();
return q*x;
}
#define RP(t,a,b) for(int t=(a),edd=(b);t<=edd;t++)
typedef double db;
const double EPS=1e-20;//这是坑点,一点要小一点,这个EPS。
int n;
const int maxn=105;
int ans[maxn];
inline db fabs(double x){
return x>=0?x:-x;
}
struct node{
db dat[maxn];
double& operator [](const int &x){
return dat[x];//重载运算符,返回引用 , 就算有dat有更多维,这样就好了,原理有关c++的“地址”系统
}
node operator *(const db &x){
node ans=(*this);//this是个指针,指向运算符左边的地址
for(int t=1;t<=n+1;t++)
ans[t]*=x;
return ans;
}
node operator /(const db &x){
node ans=(*this);
for(int t=1;t<=n+1;t++)
ans[t]/=x;
return ans;
}
node operator -(node &x){
node ans=(*this);
for(int t=1;t<=n+1;t++)
ans[t]-=x[t];
return ans;
}
node operator *=(const db &x){
return (*this)=(*this)*x;
}
node operator /=(const db &x){
return (*this)=(*this)/x;
}
node operator -=( node &x){
return (*this)=(*this)-x;
}
}data[maxn];
bool vis[maxn];
inline int big(int x){
db ans=0;
int ret;
for(int t=1;t<=n;t++)
if(!vis[t]&&ans<fabs(data[t][x]))
ret=t;
vis[ret]=1;//根据数学原理,不可重复选择一个方程来消元
return ret;//为了避免乘一个过小的数字,选择一个对于该未知数绝对值最大的系数
}
inline void kkk(void){
RP(t0,1,n){
int sttd=big(t0);
const db a=data[sttd][t0];
RP(t,1,n)
if(t!=sttd){
if(fabs(data[t][t0])<EPS){
cout<<"No Solution";//防止除0
return;
}
data[t]*=(a/data[t][t0]),data[t]-=data[sttd];//将选定x0的系数和基准方程变为一致,在通过加减消元消掉,
//此后该未知数的系数就是0,不会再产生影响
}
ans[t0]=sttd;//记录结果是哪个方程得出的
}
RP(t,1,n)
if(fabs(data[ans[t]][t])<EPS){
cout<<"No Solution"<<endl;
return;
}
RP(t,1,n){
printf("%.2lf\n",(data[ans[t]][n+1]/data[ans[t]][t]));
}
return;
}
int main(){
n=qr();
RP(t,1,n)
RP(i,1,n+1)
data[t][i]=qr();
kkk();
return 0;//功德圆满
}

题解 P3389 【【模板】高斯消元法】的更多相关文章

  1. 字符串 kmp算法 codeforce 625B 题解(模板)

    题解:kmp算法 代码: #include <iostream>#include <algorithm>#include <cstring>#include < ...

  2. CCF-CSP题解 201509-3 模板生成系统

    简单的替换一下字符串. 注意数组开大点. #include<bits/stdc++.h> const int maxm = 100; const int maxn = 100; using ...

  3. 【刷题】洛谷 P3804 【模板】后缀自动机

    题目描述 给定一个只包含小写字母的字符串 \(S\) , 请你求出 \(S\) 的所有出现次数不为 \(1\) 的子串的出现次数乘上该子串长度的最大值. 输入输出格式 输入格式: 一行一个仅包含小写字 ...

  4. [BZOJ3224]Tyvj 1728 普通平衡树

    [BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...

  5. [UOJ#34]多项式乘法

    [UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...

  6. 1711 Number Sequence(kmp)

    Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], .... ...

  7. 【LCT】BZOJ2049 [SDOI2008]Cave 洞穴勘测

    2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 10059  Solved: 4863[Submit ...

  8. 【网络流】POJ1273 Drainage Ditches

    Drainage Ditches Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 78671   Accepted: 3068 ...

  9. 【BZOJ2843】极地旅行社(Link-Cut Tree)

    [BZOJ2843]极地旅行社(Link-Cut Tree) 题面 BZOJ 题解 \(LCT\)模板题呀 没什么好说的了.. #include<iostream> #include< ...

随机推荐

  1. luogu P1489 猫狗大战

    题目描述 新一年度的猫狗大战通过SC(星际争霸)这款经典的游戏来较量,野猫和飞狗这对冤家为此已经准备好久了,为了使战争更有难度和戏剧性,双方约定只能选择Terran(人族)并且只能造机枪兵. 比赛开始 ...

  2. 2016集训测试赛(二十四)Problem B: Prz

    Solution 这道题有两个关键点: 如何找到以原串某一个位置为结尾的某个子序列的最晚出现位置 如何找到原串中某个位置之前的所有数字的最晚出现位置中的最大值 第一个关键点: 我们注意到每个数字在\( ...

  3. 轻量i3wm配置使用笔记 -- 主题切换器(j4-make-config)

    快速切换主题 j4-make-config介绍: j4-make-config脚本可以方便地在几组"主题"之间切换,还可以根据当前工作的环境,轻松地从几个不同的配置部分组合一个完整 ...

  4. linux下ftp、telnet的安装和使用

    1.ftp的安装和使用 一般在各种linux的发行版中,默认带有的ftp软件是vsftp. 使用如下命令#rpm -qa | grep vsftpd可以检测出是否安装了vsftpd软件,如果没有安装, ...

  5. CSS 属性选择器的深入挖掘

    CSS 属性选择器,可以通过已经存在的属性名或属性值匹配元素. 属性选择器是在 CSS2 中引入的并且在 CSS3 中得到了很好拓展.本文将会比较全面的介绍属性选择器,尽可能的去挖掘这个选择器在不同场 ...

  6. css样式控制元素固定在底部

    回复固定在底部:css样式用到了 box-sizing属性 box-sizing:border-box; -moz-box-sizing:border-box; /* Firefox */ -webk ...

  7. 【基础算法】排序-复杂排序之二(找出第K大的数)

    切割的思想是高速排序最精髓的地方.每一次切割出来的元素K一个排在第K位,所以利用这样的思想我们至少知道3点 1. 被切割出来的元素K最后一定排在第K位. 2. 在K左边的元素一定比K小或者相等. 3. ...

  8. linux安装svn客户端subversion及使用方法

    1.下载 [maintain@HM16-213 software]$ wget http://subversion.tigris.org/downloads/subversion-deps-1.6.1 ...

  9. JavaWeb学习笔记:Servlet

    Servlet JavaWeb 概念 Java Web应用由一组Servlet.HTML页面.类.以及其他能够被绑定的资源构成. 他能够在各种供应商提供的实现Servlet规范的Servlet容器中执 ...

  10. 【7.1.1】ELK集群搭建 之 ES集群

    写在前边 昨天晚上就已经完成这篇博客了,就是在测试这块是否正常跑起来,晚上没搞完,上班前把电脑关机带着,结果没保存!基本上昨天写的东西都丢了,好在博客园的图片url还在. 为了让大家都轻松些,我轻松写 ...