很简单啊。。。就是根据题目意思列出n+1个方程来。。。因为是n+1元二次方程组,所以我们用一个方程和其他n个方程列成等式,就可以把球心的二次项消掉了。。。剩下的就是高斯消元了。。。。
为了方便,我们可以让去配平其他n个方程的那个方程是第n+1个。这样好写一点,不容易出锅。。。
代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n;double a[15][15],val[15][15],ans[15];int main(){ #ifndef ONLINE_JUDGE freopen("ce.in","r",stdin); #endif scanf("%d",&n); for(int i=1;i<=n+1;i++) for(int j=1;j<=n;j++) scanf("%lf",&a[i][j]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) val[i][n+1]+=a[n+1][j]*a[n+1][j]-a[i][j]*a[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) val[i][j]=2*(a[n+1][j]-a[i][j]); for(int i=1;i<=n;i++) { int cur=i; for(int j=i+1;j<=n;j++) if(val[cur][i]<val[j][i]) cur=j; if(cur!=i) swap(val[i],val[cur]); double div=val[i][i]; for(int j=i;j<=n+1;j++) val[i][j]/=div; for(int j=i+1;j<=n;j++) { div=val[j][i]; for(int k=i;k<=n+1;k++) val[j][k]-=div*val[i][k]; } } for(int i=n;i>=1;i--) { ans[i]=val[i][n+1]; for(int j=i+1;j<=n;j++) ans[i]-=val[i][j]*ans[j]; } for(int i=1;i<=n;i++) printf("%.3lf ",ans[i]); return 0;}
1A真爽我还是太蒻了