bzoj1013: [JSOI2008]球形空间产生器sphere

    xiaoxiao2022-08-11  75

    bzoj1013: [JSOI2008]球形空间产生器sphere 想了想既然写了就发上来吧。


    题解

    展开距离公式变成n元一次方程组,直接高斯消元即可,保证有解。


    奇怪的代码

    #include<iostream> #include<cstdio> #include<cmath> using namespace std; int n,t; double e[12][12],ans[11]; void rev(double a[],double b[]) {for(int i=0;i<12;i++)swap(a[i],b[i]);} void sub(double a[],double b[]) {for(int i=0;i<12;i++)a[i]-=b[i];} void mul(double a[],double k) {for(int i=0;i<12;i++)a[i]*=k;} bool zer(double k) {return (k+1e-8>0)&&(k-1e-8<0);} int main() { scanf("%d",&n); for(int j=0;j<n;j++) scanf("%lf",&e[0][j]),e[0][n]+=e[0][j]*e[0][j],e[0][j]*=2; for(int i=1;i<=n;i++) { for(int j=0;j<n;j++) scanf("%lf",&e[i][j]),e[i][n]+=e[i][j]*e[i][j],e[i][j]*=2; for(int j=0;j<=n;j++) e[i][j]-=e[0][j]; } for(int i=0;i<n-1;i++) { t=i; while(zer(e[++t][i])&&t<=n); if(t>n)continue; rev(e[i+1],e[t]); for(int j=i+2;j<=n;j++) if(!zer(e[j][i])) mul(e[j],e[i+1][i]/e[j][i]),sub(e[j],e[i+1]); } ans[n-1]=e[n][n]/e[n][n-1]; for(int i=n-1;i>0;i--) { for(int j=i;j<n;j++) e[i][n]-=ans[j]*e[i][j]; ans[i-1]=e[i][n]/e[i][i-1]; } printf("%.3lf",ans[0]); for(int i=1;i<n;i++) printf(" %.3lf",ans[i]); printf("\n"); }
    转载请注明原文地址: https://ju.6miu.com/read-1132651.html
    最新回复(0)