1013: [JSOI2008]球形空间产生器sphere
很直观的一个gauss题;
用的是以前用过的一个模板;
#include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #define maxn 12 #define eps 0.00001 using namespace std; double matrix[15][15]; double ans[15]; void exchange_col(int p1,int p2,int n) { double t; int i; for(int i=0; i<=n; i++) swap(matrix[p1][i],matrix[p2][i]); } bool gauss(int n) { int i,j,k; int p; double r; for(i=0; i<n-1; i++) { p=i; for(j=i+1; j<n; j++) if(fabs(matrix[j][i])>fabs(matrix[p][i])) p=j; if(p!=i) exchange_col(i,p,n); if(matrix[i][i]==0) return false; for(j=i+1; j<n; j++) { r=matrix[j][i]/matrix[i][i]; for(k=i; k<=n; k++) matrix[j][k]-=r*matrix[i][k]; } } for(i=n-1; i>=0; i--) { ans[i]=matrix[i][n]; for(j=n-1; j>i; j--) ans[i]-=matrix[i][j]*ans[j]; if(fabs(matrix[i][i])<eps)return false; ans[i]/=matrix[i][i]; } return true; } double map[15][15]; double fang[15][15]; int main() { int n; scanf("%d",&n); for(int i=0;i<=n;i++) { for(int j=0;j<n;j++) { scanf("%lf",&map[i][j]); if(i>0) { matrix[i-1][j]=2*(map[i][j]-map[i-1][j]); fang[i-1][j]=map[i][j]*map[i][j]-map[i-1][j]*map[i-1][j]; } } } for(int i=0;i<n;i++) { double ret=0; for(int j=0;j<n;j++) ret+=fang[i][j]; matrix[i][n]=ret; } gauss(n); for(int i=0;i<n-1;i++) printf("%.3lf ",ans[i]); printf("%.3lf",ans[n-1]); return 0; }