数学:高斯消元
BZOJ1013题目描述了一个n维空间中有一个球体,给定了这个球体上n+1个点的坐标,让你写出球心的n维坐标
设球心坐标为(x1,x2,x3...xn)
(a1-x1)^2+(a2-x2)^2+...(an-xn)^2=r^2
(b1-x1)^2+(b2-x2)^2+...(bn-xn)^2=r^2
....
只要拿后n个方程分别去减第一个方程,就可以得到n个一次方程了
2*(a1-b1)x1+2*(a2-b2)*x2+.....+2*(an-bn)xn=a1^2-b1^2+a2^2-b2^2....an^2-bn^2
然后就可以高斯消元了,在这里题目的思路不重要,重要的是高斯消元的写法
1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 #define eps 1e-6 5 using namespace std; 6 const int maxn=25; 7 int n; 8 double f[maxn]; 9 double a[maxn][maxn]; 10 double sqr(double x) {return x*x;} 11 bool gauss() 12 { 13 int now=1,to; 14 double t; 15 for(int i=1;i<=n;i++) 16 { 17 for(to=now;to<=n;to++) 18 if(fabs(a[to][i])>eps) break; 19 if(to>n) continue; 20 if(to!=now) 21 for(int j=1;j<=n+1;j++) 22 swap(a[to][j],a[now][j]); 23 t=a[now][i]; 24 for(int j=1;j<=n+1;j++) a[now][j]/=t; 25 for(int j=1;j<=n;j++) 26 if(j!=now) 27 { 28 t=a[j][i]; 29 for(int k=1;k<=n+1;k++) 30 a[j][k]-=t*a[now][k]; 31 } 32 now++; 33 } 34 for(int i=now;i<=n;i++) 35 if(fabs(a[i][n+1])>eps) return 0; 36 return 1; 37 } 38 int main() 39 { 40 double t; 41 scanf("%d",&n); 42 for(int i=1;i<=n;i++) scanf("%lf",&f[i]); 43 for(int i=1;i<=n;i++) 44 for(int j=1;j<=n;j++) 45 { 46 scanf("%lf",&t); 47 a[i][j]=2*(t-f[j]); 48 a[i][n+1]+=sqr(t)-sqr(f[j]); 49 } 50 gauss(); 51 for(int i=1;i<=n-1;i++) printf("%.3lf ",a[i][n+1]); 52 printf("%.3lf\n",a[n][n+1]); 53 return 0; 54 }