bzoj1013 [JSOI2008]球形空间产生器sphere (高斯消元)
Posted 羊毛羊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1013 [JSOI2008]球形空间产生器sphere (高斯消元)相关的知识,希望对你有一定的参考价值。
1013 [JSOI2008]球形空间产生器sphere
Description
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球
面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。
Input
第一行是一个整数n(1<=N=10)。接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标。每一个实数精确到小数点
后6位,且其绝对值都不超过20000。
Output
有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开。每个实数精确到小数点
后3位。数据保证有解。你的答案必须和标准输出一模一样才能够得分。
Sample Input
0.0 0.0
-1.0 1.0
1.0 0.0
Sample Output
HINT
提示:给出两个定义:1、 球心:到球面上任意一点距离都相等的点。2、 距离:设两个n为空间上的点A, B
的坐标为(a1, a2, …, an), (b1, b2, …, bn),则AB的距离定义为:dist = sqrt( (a1-b1)^2 + (a2-b2)^2 +
… + (an-bn)^2 )
传送门
1 #include<cstring> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #define foru(i,x,y) for(int i=x;i<=y;i++) 6 #define ford(i,x,y) for(int i=x;i>=y;i--) 7 using namespace std; 8 double f[100][100],x,r[100]; 9 int n; 10 11 void gauss(){ 12 foru(i,1,n){ 13 int t=i; 14 foru(j,i+1,n)if(fabs(f[j][i])>fabs(f[t][i]))t=j; 15 if(t!=i)foru(j,i,n+1)swap(f[i][j],f[t][j]);//交换 提高精度 16 foru(j,i+1,n){ 17 double x=f[j][i]/f[i][i]; 18 foru(k,i,n+1)f[j][k]-=x*f[i][k]; 19 //f[i][i]以下的元素用f[i][i]按比例减为0,同行的其它元素按比例减去第一行的对应值 20 //即矩阵的初等行变换 21 } 22 } 23 ford(i,n,1){ 24 double t=(f[i][n+1]/=f[i][i]); 25 foru(j,1,i-1)f[j][n+1]-=(t*f[j][i]);//消元 26 } 27 } 28 29 int main(){ 30 scanf("%d",&n); 31 foru(i,1,n)scanf("%lf",&r[i]); 32 foru(i,1,n){ 33 foru(j,1,n){ 34 scanf("%lf",&x); 35 f[i][j]=2*(x-r[j]); 36 f[i][n+1]+=x*x-r[j]*r[j];//消去二次项 37 } 38 } 39 gauss(); 40 printf("%.3lf",f[1][n+1]); 41 foru(i,2,n)printf(" %.3lf",f[i][n+1]); 42 return 0; 43 }
以上是关于bzoj1013 [JSOI2008]球形空间产生器sphere (高斯消元)的主要内容,如果未能解决你的问题,请参考以下文章
BZOJ1013: [JSOI2008]球形空间产生器sphere
BZOJ 1013: [JSOI2008]球形空间产生器sphere
BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元
bzoj1013 [JSOI2008]球形空间产生器sphere (高斯消元)