bzoj1013

1013 球形空间产生器

  高斯消元,学习一波pengwill97大佬的模板

 根据题目给出的n+1个二次方程,我们可以分别将第2~n+1个与第一个做差,转换成n个一次方程

 然后进行高斯消元

 

/**************************************************************

    Problem: 1013

    User: syh0313

    Language: C++

    Result: Accepted

    Time:4 ms

    Memory:17236 kb

****************************************************************/

 

#include <iostream>

#include <algorithm>

#include <cstdio>

#include <cstring>

#include <cmath>

using namespace std;

const int N = 1010;

const double EPS=1e-7;

int nn;

double a[N][N],x[N],b[N][N];

int Gauss(int m,int n){

    int col=0, k=0;//col为列号,k为行号

    for (;k<m&&col<n;++k,++col){

        int r = k;

        for (int i=k+1;i<m;++i)

            if(fabs(a[i][col])>fabs(a[r][col]))r=i;

        if (fabs(a[r][col])<EPS){k--;continue;}//列全为0

        if (r!=k)for(int i=col;i<=n;++i)

            swap(a[k][i],a[r][i]);

        for (int i=k+1;i<m;++i)//消元

            if(fabs(a[i][col])>EPS){

            double t = a[i][col]/a[k][col];

            for (int j=col;j<=n;j++)a[i][j]-=a[k][j]*t;

            a[i][col] = 0;

        }

    }

    for(int i=k ;i<m ;++i)//无解

        if (fabs(a[i][n])>EPS) return -1;

    if (k < n) return n - k;  //自由元个数

    for (int i =n-1; i>=0; i--){//回带求解

        double temp = a[i][n];

        for (int j=i+1; j<n; ++j)

            temp -= x[j] * a[i][j];

        x[i] = (temp / a[i][i]);

    }

return 0;

}

int main()

{

    scanf("%d",&nn);

    for (int i=1;i<=nn+1;i++)

     for (int j=1;j<=nn;j++) scanf("%lf",&b[i][j]); 

    for (int i=0;i<nn;i++)

    {

        double sum=0;

        for (int j=0;j<nn;j++)

        {

            a[i][j]=2.0*(b[1][j+1]-b[i+2][j+1]);

            sum+=(b[i+2][j+1]*b[i+2][j+1]-b[1][j+1]*b[1][j+1]);

        }

        a[i][nn]=-sum;

    }

    Gauss(nn,nn);

    for (int i=0;i<nn-1;i++) printf("%.3lf ",x[i]);

    printf("%.3lf\n",x[nn-1]);

return 0;

}

模板出自:https://blog.csdn.net/pengwill97/article/details/77282328

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值