距离NOIP只有9天了 快学习快学习
可是我连高斯消元都还不会,嘤嘤%>_<%
所以这到底是个什么东东呢???
就是我们平时解一次方程组的方法,只不过用程序实现罢了(系数是具体存在矩阵(数组)里的)
其思路大致不发生改变,就是挨个消元,消到最后就可以回代了
举个栗子:
现在我们的系数长这样
[
x
y
z
v
a
l
2
1
1
1
6
2
1
−
1
−
2
2
1
7
]
\begin{bmatrix} x & y & z & val \\ 2 & 1 & 1 & 1 \\ 6 & 2 & 1 & -1 \\ -2 & 2 & 1 & 7\end{bmatrix}
⎣⎢⎢⎡x26−2y122z111val1−17⎦⎥⎥⎤
消掉 x ,也就是变成这样
[
x
y
z
v
a
l
2
1
1
1
0
−
1
−
2
−
4
0
3
2
8
]
\begin{bmatrix} x & y & z & val \\2 & 1 & 1 & 1 \\ 0 & -1 & -2 & -4 \\ 0 & 3 & 2 & 8\end{bmatrix}
⎣⎢⎢⎡x200y1−13z1−22val1−48⎦⎥⎥⎤
具体代码实现就是:
//当前要消第i个元
for(j=i+1;j<=n;++j)
for(k=i+1;k<=n+1;++k)
g[j][k]-=g[i][k]*g[j][i]/g[i][i];
然后反复搞几次
最后变成这样:
[
x
y
z
v
a
l
2
1
1
1
0
−
1
−
2
−
4
0
0
−
4
−
4
]
\begin{bmatrix} x & y & z & val \\ 2 & 1 & 1 & 1 \\ 0 & -1 & -2 & -4 \\ 0 & 0 & -4 & -4\end{bmatrix}
⎣⎢⎢⎡x200y1−10z1−2−4val1−4−4⎦⎥⎥⎤
是不是就可以算出
z
z
z啦
然后我们回代(用z把y解出来……)
还有一些无解和无穷解的情况
无解:消元完了,发现有一行系数都为0,但是常数项不为0
无穷解:消元完了,发现有好几行系数为0,常数项也为0,这样就多解了!有几行为全为0,就有几个自由元,所谓自由元,就是这些变量的值可以随意取,有无数种情况可以满足给出的方程组
Code
#include<bits/stdc++.h>
#define N 200
using namespace std;
double ans[N],g[N][N];
int n;
void gauss(){
int i,j,k;
for(i=1;i<=n;++i){
k=i;
for(j=i+1;j<=n;++j) if(fabs(g[k][i])<fabs(g[j][i])) k=j;//选系数绝对值最大的,精度
for(j=1;j<=n+1;++j) swap(g[k][j],g[i][j]);
for(j=i+1;j<=n;++j)
for(k=i+1;k<=n+1;++k)
g[j][k]-=g[i][k]*g[j][i]/g[i][i];
}
for(i=n;i>=1;--i){
for(j=i+1;j<=n;++j)
g[i][n+1]-=ans[j]*g[i][j];
ans[i]=g[i][n+1]/g[i][i];
}
}
int main(){
scanf("%d",&n);
int i,j,k;
for(i=1;i<=n;++i)
for(j=1;j<=n+1;++j)
scanf("%lf",&g[i][j]);
gauss();
for(i=1;i<=n;++i) printf("%d ",(int)(ans[i]+0.5));
return 0;
}