zoukankan      html  css  js  c++  java
  • 高斯消元

    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
  • 相关阅读:
    在Mac OS X上配置Apache2
    Safari on iOS 7 中Element.getClientRects的Bug
    Ubuntu 升级到13.10之后出现Apache2启动失败的问题
    HTML5中DOM元素的querySelector/querySelectorAll的工作机制
    TLS之上的HTTP
    Linux常用设置
    http 连接复用
    js数组的操作
    https学习总结
    教你使用shell数组
  • 原文地址:https://www.cnblogs.com/williamchenwl/p/3704997.html
Copyright © 2011-2022 走看看