• 高斯消元


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

    终于会做这道题了,列出的方程很简单

    将方程相邻相减得到关于圆心个坐标的一次方程共N个

    然后高斯消元解方程即可

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    using namespace std;
    const int N=20;
    double a[N][N],c[N][N]; 
    int n;   
    int swap(int x,int y)
       {   for (int i=0;i<=n;i++)
             {  double tmp=c[x][i];
                c[x][i]=c[y][i];
                c[y][i]=tmp;   
                }
         }
      
    int guass()
     {  for (int i=1;i<=n;i++)
         for (int k=i,j=i;j<=n;j++)
        {if (fabs(c[j][i-1])>fabs(c[k][i-1])) k=j;//找到xi-1系数最大的一排
          swap(i,k); //将i行于这一行交换
          for (int j=i+1;j<=n;j++)
            for (int k=n;k>=i-1;k--)
              c[j][k]-=c[i][k]*c[j][i-1]/c[i][i-1]; //将i+1到N行的xi-1消去
           }
            }
      
    int solve() //对得到的梯形矩阵求解
      { double ans[N];
        ans[n]=1;
        for (int i=n;i>=1;i--)
          {  double sum=0;
             for (int j=i;j<=n;j++)
             sum-=ans[j]*c[i][j]; //获得x(i+1),x(i+2)..的和
             ans[i-1]=sum/c[i][i-1];  
             }  
         for (int i=0;i<n;i++)
          if (i) printf(" %.3lf",ans[i]);
          else printf("%.3lf",ans[i]); 
          printf("
    ");
        }
      
     int main()
       { scanf("%d",&n); 
          for (int i=0;i<=n;i++) 
            for (int j=0;j<n;j++)
             scanf("%lf",&a[i][j]);
          for (int i=1;i<=n;i++)
            for (int j=0;j<n;j++)
              c[i][j]=2*(a[i-1][j]-a[i][j]),
              c[i][n]+=a[i][j]*a[i][j]-a[i-1][j]*a[i-1][j];
            guass();
            solve();    
          }
    View Code
  • 相关阅读:
    AtCoder Grand Contest 015 题解
    AtCoder Grand Contest 014 题解
    AtCoder Grand Contest 013 题解
    AtCoder Grand Contest 012 题解
    AtCoder Grand Contest 011 题解
    AtCoder Grand Contest 010 题解
    AtCoder Grand Contest 009 题解
    NOIP2017 Day2 题解
    博客园主题备份
    多项式全家桶
  • 原文地址:https://www.cnblogs.com/williamchenwl/p/3704997.html
Copyright © 2020-2023  润新知