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
  • 相关阅读:
    遍历指定目录及其子目录下所有文件
    vim 配置
    解决 Mendeley Linux 中文输入问题
    全角半角字符对照表
    chrome 替换多线程下载管理器
    查看系统日志
    中大东校区iNode For linux 配置笔记
    anaconda 虚拟环境笔记
    linux 网络操作
    deepin 装机
  • 原文地址:https://www.cnblogs.com/williamchenwl/p/3704997.html
Copyright © 2011-2022 走看看