NC20167. [JSOI2008]球形空间产生器SPHERE
描述
输入描述
第一行是一个整数n(1 ≤ N=10)。
接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标。
每一个实数精确到小数点后6位,且其绝对值都不超过20000。
输出描述
有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开。
每个实数精确到小数点 后3位。数据保证有解。你的答案必须和标准输出一模一样才能够得分。
示例1
输入:
2 0.0 0.0 -1.0 1.0 1.0 0.0
输出:
0.500 1.500
C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 620K, 提交时间: 2020-06-03 08:55:24
#include<bits/stdc++.h> using namespace std; double a[20][20],b[20],c[20][20]; int n; int main() { cin>>n; for(int i=1; i<=n+1; i++) for(int j=1; j<=n; j++) cin>>a[i][j]; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { c[i][j]=2*(a[i][j]-a[i+1][j]); b[i]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j]; } for(int i=1; i<=n; i++) { for(int j=i; j<=n; j++) { if(fabs(c[j][i])>1E-8) { for(int k=1; k<=n; k++)swap(c[i][k],c[j][k]); swap(b[i],b[j]); } }//处理第i行,保证c[i][i]不等于0; for(int j=1; j<=n; j++) { if(i==j)continue; double rate=c[j][i]/c[i][i]; for(int k=i; k<=n; k++)c[j][k]-=rate*c[i][k]; b[j]-=b[i]*rate; }//将第j个方程中第i个未知数的系数清为0; } for(int i=1; i<n; i++) printf("%.3f ",b[i]/c[i][i]); printf("%.3f",b[n]/c[n][n]); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2020-08-29 16:30:00
#include<bits/stdc++.h> using namespace std; double a[20][20],b[20],c[20][20]; int n; int main(){ cin>>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++){ c[i][j]=2*(a[i][j]-a[i+1][j]); b[i]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j]; } } for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ if(fabs(c[j][i])>1e-8){ for(int k=1;k<=n;k++) swap(c[i][k],c[j][k]); swap(b[i],b[j]); } } for(int j=1;j<=n;j++){ if(i==j) continue; double rate=c[j][i]/c[i][i]; for(int k=i;k<=n;k++) c[j][k]-=c[i][k]*rate; b[j]-=b[i]*rate; } } for(int i=1;i<n;i++) printf("%.3lf ",b[i]/c[i][i]); printf("%.3lf\n",b[n]/c[n][n]); return 0; }
C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 408K, 提交时间: 2023-03-07 20:06:01
#include<bits/stdc++.h> using namespace std; const int N=20; double a[N][N],b[N],c[N][N]; int main() { int n; cin>>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){ c[i][j]=2*(a[i][j]-a[i+1][j]); b[i]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j]; } for(int i=1;i<=n;++i){ for(int j=i;j<=n;++j){ if(fabs(c[j][i]>1e-8)){ for(int k=1;k<=n;++k) swap(c[i][k],c[j][k]); swap(b[i],b[j]); } } for(int j=1;j<=n;++j){ if(i==j) continue; double rat=c[j][i]/c[i][i]; for(int k=i;k<=n;++k) c[j][k]-=c[i][k]*rat; b[j]-=b[i]*rat; } } for(int i=1;i<=n;++i) printf("%.3f ",b[i]/c[i][i]); return 0; }