BZOJ 1013 [JSOI2008]球形空间产生器sphere | 高斯消元

Posted MSPqwq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1013 [JSOI2008]球形空间产生器sphere | 高斯消元相关的知识,希望对你有一定的参考价值。

题目:

http://www.lydsy.com/JudgeOnline/problem.php?id=1013


题解:

考虑二维的我们可以明白一个道理:

两个点左边可以表示一个方程,然后用两两方程相减得到一个一次方程

这样用高斯消元就可以做了

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 13
using namespace std;
int n,m;
double c[N][N],f[N][N],ans[N];
inline void Gauss()
{
    for (int i=1;i<=n;i++)
    {
    int l=i;
    for (int j=l+1;j<=n;j++)
        if (fabs(f[l][i]) < fabs(f[j][i])) l=j;
    if (l!=i)
        for (int j=i;j<=m;j++)
        swap(f[l][j],f[i][j]);
    for (int j=i+1;j<=n;j++)
    {
        double temp=f[j][i]/f[i][i];
        for (int k=i;k<=m;k++)
        f[j][k]=f[j][k]-f[i][k]*temp;
    }
    }
    for (int i=n;i>=1;i--)
    {
    double t=f[i][m];
    for (int j=n;j>i;j--)
        t-=ans[j]*f[i][j];
    ans[i]=t/f[i][i];
    }
}
int main()
{
    scanf("%d",&n);m=n+1;
    for (int i=0;i<=n;i++)
    for (int j=1;j<=n;j++)
        scanf("%lf",&c[i][j]);
    for (int i=1;i<=n;i++)
    {
    int j=i-1;double d=0;
    for (int k=1;k<=n;k++)
    {
        f[i][k]=(c[i][k]-c[j][k])*2;
        d+=c[i][k]*c[i][k]-c[j][k]*c[j][k];
    }
    f[i][m]=d;
    }
    Gauss();
    for (int i=1;i<=n;i++)
    if (i<n) printf("%.3lf ",ans[i]);
    else printf("%.3lf\n",ans[i]);
    return 0;
}

 

以上是关于BZOJ 1013 [JSOI2008]球形空间产生器sphere | 高斯消元的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1013: [JSOI2008]球形空间产生器sphere

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

BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元

bzoj1013 [JSOI2008]球形空间产生器sphere (高斯消元)

BZOJ1013:[JSOI2008]球形空间产生器——题解

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