【JSOI2008】 球形空间产生器—题解
题目:P4035
高中解析几何题
题意:求出一个n元组
,满足:
,
根据高中数学常用套路,我们对上面这n+1个方程两两做差,可以消去常数C,得到如下n个一次方程:

对这个线性方程组使用高斯消元,解出未知数即可。
代码:
#include<bits/stdc++.h> using namespace std; #define il inline #define ll long long #define D double #define dg() printf("114514 ") #define print(x) printf("%d ",x) #define eps 1e-16 int read() { int s=0,w=1; char ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-') w=-1; ch=getchar();} while(ch>='0' && ch<='9') s=s*10+ch-'0',ch=getchar(); return s*w; } int n; D a[20][20]; void init() { for(int i=1;i<=n+1;i++) { for(int j=1;j<=n;j++) { scanf("%lf",&a[i][j]); if(i>=2) { a[i-1][n+1]+=a[i-1][j]*a[i-1][j]-a[i][j]*a[i][j]; a[i-1][j]=2*(a[i-1][j]-a[i][j]); } } } } void deal() { for(int i=1;i<=n;i++) { int maxn=i; for(int j=i+1;j<=n;j++) if(fabs(a[maxn][i]) < fabs(a[j][i])) maxn=j; for(int j=1;j<=n+1;j++) swap(a[i][j],a[maxn][j]); for(int j=i+1;j<=n;j++) { if(fabs(a[i][i]) < eps) continue; D temp=a[j][i]/a[i][i]; for(int k=i;k<=n+1;k++) { a[j][k]-=a[i][k]*temp; } } } for(int i=n;i>=1;i--) { if(fabs(a[i][i]) < eps) continue; a[i][n+1]/=a[i][i]; for(int j=i-1;j>=1;j--) { a[j][n+1]-=a[i][n+1]*a[j][i]; a[j][i]=0; } } } int main() { n=read(); init(); deal(); for(int i=1;i<=n;i++) printf("%.3lf ",a[i][n+1]); return 0; }

浙公网安备 33010602011771号