zoukankan      html  css  js  c++  java
  • BZOJ1013:[JSOI2008]球形空间产生器——题解

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

    Description

      有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。

    Input

      第一行是一个整数n(1<=N=10)。接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标。每一个实数精确到小数点后6位,且其绝对值都不超过20000。

    Output

      有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开。每个实数精确到小数点后3位。数据保证有解。你的答案必须和标准输出一模一样才能够得分。

    Sample Input

    2
    0.0 0.0
    -1.0 1.0
    1.0 0.0

    Sample Output

    0.500 1.500

    HINT

      提示:给出两个定义:1、 球心:到球面上任意一点距离都相等的点。2、 距离:设两个n为空间上的点A, B的坐标为(a1, a2, …, an), (b1, b2, …, bn),则AB的距离定义为:dist = sqrt( (a1-b1)^2 + (a2-b2)^2 + … + (an-bn)^2 )

    高斯消元裸题。

    我们根据公式设球心为(x1,x2,x3……xn)得到:

    (a1-x1)^2 + (a2-x2)^2 + … + (an-xn)^2=(b1-x1)^2 + (b2-x2)^2 + … + (bn-xn)^2

    化简得到:

    2(a1-b1)x1+2(a2-b2)x2+...+2(an-bn)xn=(a1^2+a2^2+...+an^2-b1^2-b2^2-...-b3^2)

    可以得到n个式子,高斯消元即可。

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    typedef double dl;
    const int N=13;
    int n,m;
    dl 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++){
            dl 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--){
        dl t=f[i][m];
        for(int j=n;j>i;j--)
            t-=ans[j]*f[i][j];
        ans[i]=t/f[i][i];
        }
        return ;
    }
    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;dl 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
    ",ans[i]);
        }
        return 0;
    }
  • 相关阅读:
    Quicksum -SilverN
    uva 140 bandwidth (好题) ——yhx
    uva 129 krypton factors ——yhx
    uva 524 prime ring problem——yhx
    uva 10976 fractions again(水题)——yhx
    uva 11059 maximum product(水题)——yhx
    uva 725 division(水题)——yhx
    uva 11853 paintball(好题)——yhx
    uva 1599 ideal path(好题)——yhx
    uva 1572 self-assembly ——yhx
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/8270102.html
Copyright © 2011-2022 走看看