高斯消元
/************************************************************** Problem: 1013 User: lxy8584099 Language: C++ Result: Accepted Time:12 ms Memory:824 kb ****************************************************************/ /* 可以证明 要确定一个n为的东西 就需要n+1个俩俩不共线的点 选择其中一个点作为没接 与剩下n个点 建立方程 刚好 n个未知量 n个方程 高斯消元! */ #include<cmath> #include<cstdio> #include<algorithm> #define db double #define sqr(x) ((x)*(x)) using namespace std; const int N=20; int n; db f[N][N],A[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lf",&A[i]); A[n+1]+=sqr(A[i]); } for(int i=1;i<=n;i++) { double all=0,x; for(int j=1;j<=n;j++) { scanf("%lf",&x); all+=sqr(x); f[i][j]=2*(A[j]-x); } f[i][n+1]=A[n+1]-all; } for(int i=1;i<=n;i++) { int bj=i; for(int j=i+1;j<=n;j++) if(fabs(f[bj][i])<fabs(f[j][i])) bj=j; swap(f[i],f[bj]); double t=f[i][i]; for(int j=1;j<=n+1;j++) f[i][j]/=t; for(int j=1;j<=n;j++) if(j!=i) { double p=f[j][i]; for(int k=1;k<=n+1;k++) f[j][k]-=f[i][k]*p; } } for(int i=1;i<=n;i++) printf("%.3lf ",f[i][n+1]); printf("\n"); return 0; }

京公网安备 11010502036488号