Problem
Mean
求给定的n+1个点所确定的n维球面的球心。
Analysis
高斯消元裸题。(第一次打没有1A很失望)
可以先设球心坐标,用距离公式表示出其与某点的距离。
用该表达式与其他n个表达式相减即可得到关于球心坐标的n个方程。
接着套用高斯消元即可。
需要注意输出末尾不能有空格。
Code
#include<cstdio>
#include<cmath>
const int N=15;
int n,i,j,k;
double t,d[N][N],a[N][N],ans[N];
int main(){
scanf("%d",&n);
for(i=0;i<=n;i++) for(j=1;j<=n;j++) scanf("%lf",&d[i][j]);
for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=2*(d[i][j]-d[0][j]),a[i][n+1]+=d[i][j]*d[i][j]-d[0][j]*d[0][j];
for(i=1;i<=n;i++){
for(k=i,j=i+1;j<=n;j++) if(fabs(a[j][i])>fabs(a[k][i])) k=j;
if(k!=i) for(j=i;j<=n+1;j++) t=a[i][j],a[i][j]=a[k][j],a[k][j]=t;
for(j=i+1;j<=n;j++) for(t=a[j][i]/a[i][i],k=i;k<=n+1;k++) a[j][k]-=a[i][k]*t;
}
for(ans[n]=a[n][n+1]/a[n][n],i=n-1;i;i--){
for(ans[i]=a[i][n+1],j=n;j>i;j--) ans[i]-=ans[j]*a[i][j];
ans[i]/=a[i][i];
}
for(i=1;i<n;i++) printf("%.3f ",ans[i]);
printf("%.3f",ans[n]);
return 0;
}