题目链接
题目大意:给出n维空间中给出n+1个点的坐标,求球心坐标
题解:设球心坐标为 (x1,x2,x3,…,xn) 第i个点的坐标为 (ai1,ai2,ai3,…,ain) 由题意得到n+1个方程 (a11−x1)2+(a12−x2)2+(a1n−xn)2=r2 (a21−x1)2+(a22−x2)2+(a2n−xn)2=r2 ……
将后n个方程减去第一个方程,得到n个n元线性方程,就能用高斯消元了
我的收获:线性方程组的转化
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <queue> using namespace std; #define eps 1e-9 const int M=30; double f[M],a[M][M]; int n; void Gauss(){ for(int i=1;i<=n;i++){ int r=i; for(int j=i+1;j<=n;j++) if(fabs(a[r][i])<fabs(a[j][i])+eps) r=j; if(r!=i) for(int j=1;j<=n+1;j++) swap(a[i][j],a[r][j]);//不加这两行巨快…… for(int j=n+1;j>=i;j--) for(int k=1;k<=n;k++) if(k!=i) a[k][j]-=a[k][i]/a[i][i]*a[i][j]; } for(int i=1;i<=n;i++) f[i]=a[i][n+1]/a[i][i];//最后解一个一元一次方程组 } void work() { Gauss(); for(int i=1;i<n;i++) printf("%.3lf ",f[i]); printf("%.3lf",f[n]);//输出格式………… } void init() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf",&f[i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { double t;scanf("%lf",&t); a[i][j]=2*(t-f[j]); a[i][n+1]+=t*t-f[j]*f[j];//常数项 } } int main() { init(); work(); return 0; }