【BZOJ】1013 [JSOI2008]球形空间产生器sphere

【算法】高斯消元

【题解】

建矩阵;

for i

  找到同列绝对值最大数字;

  交换;

  for k(行) j(列)(倒序)   除法;

for i(倒序)

  for j 减去已知元素

  除到右边;

#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;
}
View Code
原文地址:https://www.cnblogs.com/onioncyc/p/6611073.html