bzoj1013 [JSOI2008]球形空间产生器sphere
题解:
考虑两个点对于球心的影响,即距离相等,任意两个点能得到$1$个方程。
有效方程只有$n$个,相邻两行处理一下即可。
高消。
代码:
#include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 15; const double eps = 1e-6; int n; double x[N][N],a[N][N],s[N]; void gs() { for(int i=1;i<=n;i++) { int tmp = i; while(fabs(a[tmp][i])<=eps)tmp++; if(tmp!=i)for(int j=1;j<=n+1;j++)swap(a[i][j],a[tmp][j]); double now = a[i][i]; for(int j=i;j<=n+1;j++)a[i][j]/=now; for(int j=i+1;j<=n;j++) { now = a[j][i]; for(int k=i;k<=n+1;k++)a[j][k]-=now*a[i][k]; } } for(int i=n;i>=1;i--) for(int j=i-1;j>=1;j--) a[j][n+1]-=a[j][i]*a[i][n+1]; } int main() { scanf("%d",&n); for(int i=1;i<=n+1;i++) for(int j=1;j<=n;j++) { scanf("%lf",&x[i][j]); s[i]+=x[i][j]*x[i][j]; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) a[i][j]=2.0*(x[i][j]-x[i+1][j]); a[i][n+1]=s[i]-s[i+1]; } gs(); for(int i=1;i<=n;i++)printf("%.3lf ",a[i][n+1]); puts(""); return 0; }