BZOJ 1013: [JSOI2008]球形空间产生器sphere
正文索引 [隐藏]
Description
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。
Input
第一行是一个整数,n。接下来的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
0.0 0.0
-1.0 1.0
1.0 0.0
Sample Output
0.500 1.500
HINT
数据规模:
对于40%的数据,1<=n<=3
对于100%的数据,1<=n<=10
提示:给出两个定义:
1、 球心:到球面上任意一点距离都相等的点。
2、 距离:设两个n为空间上的点A, B的坐标为(a1, a2, …, an), (b1, b2, …, bn),则AB的距离定义为:dist = sqrt( (a1-b1)^2 + (a2-b2)^2 + … + (an-bn)^2 )
对于40%的数据,1<=n<=3
对于100%的数据,1<=n<=10
提示:给出两个定义:
1、 球心:到球面上任意一点距离都相等的点。
2、 距离:设两个n为空间上的点A, B的坐标为(a1, a2, …, an), (b1, b2, …, bn),则AB的距离定义为:dist = sqrt( (a1-b1)^2 + (a2-b2)^2 + … + (an-bn)^2 )
题解
我们观察二维的状态,设球心为(a,b),已知坐标(x1,y1)、(x2,y2)
[latex](x1-a)^2+(y1-b)^2=(x2-a)^2+(y2-b)^2[/latex]
然后化简得到
[latex]2(x1-x2)a+2(y1-y2)b=x2^2-x1^2+y2^2-y1^2[/latex]
然后高斯消元。【倒,早上就这么荒废了、、
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#include<cstdio> using namespace std; const int Maxn=25; const int Eps=1e-6; int n; double num[Maxn][Maxn]; double f[Maxn][Maxn]; inline double sqr(double x){ return x*x; } inline double abs(double x){ if (x<0) return x; } inline void swap(double &a,double &b){ double tmp=a;a=b;b=tmp; } inline void gauss(){ int pos; for (int i=1;i<n;i++){ pos=i; for (int j=i+1;j<=n;j++) if (abs(f[j][i])>abs(f[pos][i])) pos=j; for (int j=1;j<=n+1;j++) swap(f[i][j],f[pos][j]); for (int j=i+1;j<=n;j++){ double t=f[j][i]/f[i][i]; for (int k=1;k<=n+1;k++) f[j][k]-=t*f[i][k]; } } for(int i=n;i>=1;i--){ for(int j=i+1;j<=n;j++) f[i][n+1]-=f[j][n+1]*f[i][j]; f[i][n+1]/=f[i][i]; } } int main(){ scanf("%d",&n); for (int i=1;i<=n+1;i++) for (int j=1;j<=n;j++) scanf("%lf",&num[i][j]); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++){ f[i][j]=2*(num[i+1][j]-num[i][j]); f[i][n+1]+=sqr(num[i+1][j])-sqr(num[i][j]); } gauss(); for (int i=1;i<n;i++) printf("%.3lf ",f[i][n+1]); printf("%.3lfn",f[n][n+1]); return 0; } |

原文链接:BZOJ 1013: [JSOI2008]球形空间产生器sphere
WNJXYKの博客 版权所有,转载请注明出处。
还没有任何评论,你来说两句吧!