【BZOJ】1013 [JSOI2008]球形空间产生器sphere
【算法】高斯消元
【题解】
建矩阵;
for i
找到同列绝对值最大数字;
交换;
for k(行) j(列)(倒序) 除法;
for i(倒序)
for j 减去已知元素
除到右边;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<algorithm> #include<cmath> #include<cstring> using namespace std; const double eps=1e-6; const int maxn=15; double a[maxn][maxn],f[maxn]; int n; void gauss() { int r; for(int i=1;i<=n;i++) { r=i; for(int j=i+1;j<=n;j++) if(fabs(a[j][i])>fabs(a[r][i]))r=j; if(r!=i)for(int j=1;j<=n+1;j++)swap(a[r][j],a[i][j]); for(int k=i+1;k<=n;k++) for(int j=n+1;j>=i;j--) a[k][j]-=a[k][i]/a[i][i]*a[i][j]; } for(int i=n;i>=1;i--) { for(int j=i+1;j<=n;j++) a[i][n+1]-=a[j][n+1]*a[i][j]; a[i][n+1]/=a[i][i]; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lf",&f[i]); double t; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%lf",&t); a[i][j]=2*(t-f[j]); a[i][n+1]+=t*t-f[j]*f[j]; } } gauss(); for(int i=1;i<n;i++)printf("%.3lf ",a[i][n+1]); printf("%.3lf",a[n][n+1]); return 0; }