P4035 [JSOI2008]球形空间产生器
作者:互联网
如有乱码,请点击。
题目描述
有一个球形空间产生器能够在 nn 维空间中产生一个坚硬的球体。现在,你被困在了这个 nn 维球体中,你只知道球面上 n+1n+1 个点的坐标,你需要以最快的速度确定这个 nn 维球体的球心坐标,以便于摧毁这个球形空间产生器。
输入格式
第一行是一个整数 nn (1<=N=10)(1<=N=10)。接下来的 n+1n+1 行,每行有 nn 个实数,表示球面上一点的 nn维坐标。每一个实数精确到小数点后 66 位,且其绝对值都不超过 2000020000。
输出格式
有且只有一行,依次给出球心的 nn 维坐标( nn 个实数),两个实数之间用一个空格隔开。每个实数精确到小数点后 33 位。数据保证有解。你的答案必须和标准输出一模一样才能够得分。
输入输出样例
输入 #12 0.0 0.0 -1.0 1.0 1.0 0.0输出 #1
0.500 1.500
说明/提示
提示:给出两个定义:
- 球心:到球面上任意一点距离都相等的点。
- 距离:设两个n为空间上的点A, B的坐标为(a_1, a_2, \cdots , a_n), (b_1, b_2, \cdots , b_n)(a1,a2,⋯,an),(b1,b2,⋯,bn),则AB的距离定义为:dist = \sqrt{ (a_1-b_1)^2 + (a_2-b_2)^2 + \cdots + (a_n-b_n)^2 }dist=(a1−b1)2+(a2−b2)2+⋯+(an−bn)2
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; double a[15][15],f[15]; int n; int read(){ int a=0,b=1; char ch=getchar(); while((ch<'0'||ch>'9')&&(ch!='-')){ ch=getchar(); } if(ch=='-'){ b=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ a=a*10+ch-'0'; ch=getchar(); } return a*b; } void gauss(){ for(int i=0;i<n;i++){ double maxs=-1.0; int id=0; for(int j=i;j<n;j++){ if(abs(a[j][i])>maxs){ maxs=abs(a[j][i]); id=j; } } if(id!=i){ for(int j=0;j<=n;j++){ swap(a[i][j],a[id][j]); } } double t=a[i][i]; for(int j=0;j<=n;j++){ a[i][j]/=t; } for(int j=0;j<n;j++){ if(i!=j){ t=a[j][i]; for(int k=0;k<=n;k++){ a[j][k]-=t*a[i][k]; } } } } } int main(){ n=read(); for(int i=0;i<n;i++){ scanf("%lf",&f[i]); } for(int i=0;i<n;i++){ a[i][n]=0; } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ double x; scanf("%lf",&x); a[i][j]=2*(x-f[j]); a[i][n]+=(x*x)-(f[j]*f[j]); } } gauss(); for(int i=0;i<n-1;i++){ printf("%.3lf ",a[i][n]); } printf("%.3lf\n",a[n-1][n]); return 0; }
标签:ch,P4035,nn,int,JSOI2008,cdots,产生器,include,getchar 来源: https://www.cnblogs.com/xiongchongwen/p/11821461.html