题目链接
https://www.luogu.org/problem/P3389
分析
因为题目涉及实数,所以使用精度较高的主元高斯消元法,即在高斯消元法的基础上,每次向下找到当前列上绝对值最大的一行来消元。
AC代码
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
inline int read() {
int num = 0, flag = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') flag = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
num = num * 10 + c - '0', c = getchar();
return flag * num;
}
const int maxn = 105;
const double eps = 1e-6;
int n;
double x[maxn][maxn];
inline int gauss() {
for (int i = 1; i <= n; ++i) {
int p = i;
for (int j = i + 1; j <= n; ++j)
if (fabs(x[j][i]) > fabs(x[p][i])) p = j;
if (fabs(x[p][i]) < eps) return 0;
for (int j = 1; j <= n + 1; ++j) swap(x[i][j], x[p][j]);
for (int j = n + 1; j >= i; --j) x[i][j] /= x[i][i];
for (int j = 1; j <= n; ++j) {
if (j == i) continue;
double r = x[j][i];
for (int k = i; k <= n + 1; ++k) x[j][k] -= r * x[i][k];
}
}
return 1;
}
int main() {
n = read();
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n + 1; ++j) x[i][j] = read();
if (!gauss()) printf("No Solution");
else for (int i = 1; i <= n; ++i) printf("%.2f\n", x[i][n + 1]);
return 0;
}