1013: [JSOI2008]球形空间产生器sphere
题目描述
有一个球形空间产生器能够在
n
维空间中产生一个坚硬的球体。现在,你被困在了这个
解题思路
这个
因为所以点在球面上,所以点到球心的距离显然是相等的,通过距离公式可以列出
∑i=1n(w[1][i]−Oi)2=∑i=1n(w[2][i]−Oi)2=...=∑i=1n(w[n+1][i]−Oi)2
如果同时减去第一项可以等到n个方程。
∑i=1n2∗(w[2][i]−w[1][i])=∑i=1nw[2][i]2−w[1][i]2
∑i=1n2∗(w[3][i]−w[1][i])=∑i=1nw[3][i]2−w[1][i]2
⋮
∑i=1n2∗(w[n+1][i]−w[1][i])Oi=∑i=1nw[n+1][i]2−w[1][i]2
然后直接套用高斯消元就可以了。
zhe#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=15;
double a[maxn][maxn],w[maxn][maxn],ans[maxn];
int n;
int main(){
freopen("exam.in","r",stdin);
freopen("exam.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n+1;i++)
for (int j=1;j<=n;j++) scanf("%lf",&w[i][j]);
for (int i=2;i<=n+1;i++)
for (int j=1;j<=n;j++)
a[i-1][j]=(w[i][j]-w[1][j])*(double)2,a[i-1][n+1]+=w[i][j]*w[i][j]-w[1][j]*w[1][j];
for (int t=1;t<=n;t++){
int h;
for (int i=t;i<=n;i++) if (fabs(a[i][t])>1e-10){h=i;break;}
swap(a[t],a[h]);
for (int i=t+1;i<=n;i++){
double x=a[i][t]/a[t][t];
for (int j=t;j<=n+1;j++) a[i][j]-=a[t][j]*x;
}
}
for (int i=n;i>=1;i--){
ans[i]=a[i][n+1];
for (int j=i+1;j<=n;j++) ans[i]-=ans[j]*a[i][j];
ans[i]/=a[i][i];
}
for (int i=1;i<=n;i++){
printf("%.3lf",ans[i]);
if (i==n) printf("\n");else printf(" ");
}
return 0;
}