数学:高斯消元

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 }

 

posted @ 2018-09-04 10:43  静听风吟。  阅读(135)  评论(0编辑  收藏  举报