1013 球形空间产生器
高斯消元,学习一波pengwill97大佬的模板
根据题目给出的n+1个二次方程,我们可以分别将第2~n+1个与第一个做差,转换成n个一次方程
然后进行高斯消元
/**************************************************************
Problem: 1013
User: syh0313
Language: C++
Result: Accepted
Time:4 ms
Memory:17236 kb
****************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using
namespace
std;
const
int
N = 1010;
const
double
EPS=1e-7;
int
nn;
double
a[N][N],x[N],b[N][N];
int
Gauss(
int
m,
int
n){
int
col=0, k=0;
//col为列号,k为行号
for
(;k<m&&col<n;++k,++col){
int
r = k;
for
(
int
i=k+1;i<m;++i)
if
(
fabs
(a[i][col])>
fabs
(a[r][col]))r=i;
if
(
fabs
(a[r][col])<EPS){k--;
continue
;}
//列全为0
if
(r!=k)
for
(
int
i=col;i<=n;++i)
swap(a[k][i],a[r][i]);
for
(
int
i=k+1;i<m;++i)
//消元
if
(
fabs
(a[i][col])>EPS){
double
t = a[i][col]/a[k][col];
for
(
int
j=col;j<=n;j++)a[i][j]-=a[k][j]*t;
a[i][col] = 0;
}
}
for
(
int
i=k ;i<m ;++i)
//无解
if
(
fabs
(a[i][n])>EPS)
return
-1;
if
(k < n)
return
n - k;
//自由元个数
for
(
int
i =n-1; i>=0; i--){
//回带求解
double
temp = a[i][n];
for
(
int
j=i+1; j<n; ++j)
temp -= x[j] * a[i][j];
x[i] = (temp / a[i][i]);
}
return
0;
}
int
main()
{
scanf
(
"%d"
,&nn);
for
(
int
i=1;i<=nn+1;i++)
for
(
int
j=1;j<=nn;j++)
scanf
(
"%lf"
,&b[i][j]);
for
(
int
i=0;i<nn;i++)
{
double
sum=0;
for
(
int
j=0;j<nn;j++)
{
a[i][j]=2.0*(b[1][j+1]-b[i+2][j+1]);
sum+=(b[i+2][j+1]*b[i+2][j+1]-b[1][j+1]*b[1][j+1]);
}
a[i][nn]=-sum;
}
Gauss(nn,nn);
for
(
int
i=0;i<nn-1;i++)
printf
(
"%.3lf "
,x[i]);
printf
(
"%.3lf\n"
,x[nn-1]);
return
0;
}
模板出自:
https://blog.csdn.net/pengwill97/article/details/77282328