BZOJ 1013--球形空间产生器(高斯消元)

Posted

tags:

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

    。。。第一次打高斯消元

 

题目链接:

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

Solution

    先考虑二维的情况:

      设圆心A(x,y),给定的点B(a,b)

                     B 到圆心 A 的距离为 ( a - x ) ^ 2 + ( b - y ) ^ 2 = a ^ 2 - 2ax + x ^ 2 + b ^ 2 - 2by + y^2

      假如还有一个点C(a1,b1)

      则2(a1-a)x+2(b1-b)y=a1^2-a^2+b1^2-b^2

    可以发现:n个点就可以列出 ( n - 1 ) 个不同的方程。

    然后用一下高斯消元就行了。。

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#define M 20  
using namespace std;  
int n;  
double pos[M],a[M][M],ans[M];  
int main(){
    int i,j,k;  
    scanf("%d",&n);
    for(i=1;i<=n;i++)  
        scanf("%lf",&pos[i]);  
    for(i=1;i<=n;i++){
        double temp[M];  
        for(j=1;j<=n;j++){
            scanf("%lf",&temp[j]);  
            a[i][j]=pos[j]-temp[j];  
            a[i][n+1]+=pos[j]*pos[j]-temp[j]*temp[j];
        }  
        a[i][n+1]/=2;
    }
    for(i=1;i<=n;i++){
        k=0;  
        for(j=i;j<=n;j++)  
            if( fabs(a[j][i])>fabs(a[k][i]) )  
                k=j;
        for(j=1;j<=n+1;j++)  
            swap(a[i][j],a[k][j]);
        for(j=i+1;j<=n;j++){
            double temp=-a[j][i]/a[i][i];  
            for(k=i;k<=n+1;k++)
                a[j][k]+=a[i][k]*temp;  
        }
    }
    for(i=n;i;i--){
        for(j=n;j>i;j--)  
            a[i][n+1]-=a[i][j]*ans[j];  
        ans[i]=a[i][n+1]/a[i][i];  
    }  
    for(i=1;i<=n;i++)  
        printf("%.3lf%c",ans[i],i==n?‘\n‘:‘ ‘);
    return 0;
}

  

  

This passage is made by Iscream-2001.

 

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

高斯消元-bzoj1013-球形空间产生器

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

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

[JSOI2008][BZOJ1013] 球形空间产生器 - 高斯消元

BZOJ 1013JSOI2008球形空间产生器sphere 高斯消元基础题

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