zoukankan      html  css  js  c++  java
  • 洛谷P4035 [JSOI2008]球形空间产生器(高斯消元)

    题面

    传送门

    题解

    好吧……说实话之前那份高斯消元的根本看不懂……这份清楚多了……

    我们可以把(p_1)看做原点,剩下的点变成(p_i-p_1),剩下(n)个向量线性组合肯定可以构成一个超平面,而圆心肯定在这个超平面上

    对于每一个向量都有一个未知数表示其系数,然后一个有(n)个方程,分别表示圆心到(p_1)(p_i)的距离相等,那么(n)个方程解(n)个未知数,高斯消元就行了

    注意这里方程怎么列呢?第(k)个方程大概就是

    [left(sum lambda_ip_i ight)^2=left(sum lambda _ip_i-p_k ight)^2 ]

    这里乘法代表的是点乘

    化一下柿子就有

    [2sum lambda_ip_kp_i=p_k^2 ]

    然后没有然后了

    //minamoto
    #include<bits/stdc++.h>
    #define R register
    #define inline __inline__ __attribute__((always_inline))
    #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
    #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
    #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
    using namespace std;
    const int N=15;const double eps=1e-10;
    int n;
    struct node{
    	double a[N];
    	inline double &operator [](const int &x){return a[x];}
    	inline node operator +(node &b)const{
    		node c;
    		fp(i,1,n)c.a[i]=a[i]+b[i];
    		return c;
    	}
    	inline node operator -(node &b)const{
    		node c;
    		fp(i,1,n)c[i]=a[i]-b[i];
    		return c;
    	}
    	inline double operator ^(node &b)const{
    		double res=0;
    		fp(i,1,n)res+=a[i]*b[i];
    		return res;
    	}
    	inline node operator *(R double b)const{
    		node c;
    		fp(i,1,n)c[i]=a[i]*b;
    		return c;
    	}
    }p[N],o;
    double a[N][N];
    void Gauss(int n){
    	fp(i,1,n){
    		int k=i;
    		fp(j,i+1,n)if(fabs(a[j][i])>fabs(a[k][i]))k=j;
    		fp(j,i,n+1)swap(a[i][j],a[k][j]);
    		double t=1.0/a[i][i];
    		fp(j,i,n+1)a[i][j]*=t;
    		fp(j,i+1,n){
    			t=a[j][i];
    			fp(k,i,n+1)a[j][k]-=t*a[i][k];
    		}
    	}
    	fd(i,n,1){
    		if(fabs(a[i][i])<eps)continue;
    		double t=1.0/a[i][i];
    		fd(j,i-1,1)fd(k,n+1,i)a[j][k]-=a[j][i]*t*a[i][k];
    		a[i][n+1]*=t;
    	}
    }
    int main(){
    //	freopen("testdata.in","r",stdin);
    	scanf("%d",&n);
    	fp(i,1,n+1)fp(j,1,n)scanf("%lf",&p[i][j]);
    	fp(i,2,n+1)p[i]=p[i]-p[1];
    	fp(i,2,n+1)fp(j,i,n+1)a[i-1][j-1]=a[j-1][i-1]=(p[i]^p[j])*2;
    	fp(i,2,n+1)a[i-1][n+1]=p[i]^p[i];
    	Gauss(n);
    	o=p[1];
    	fp(i,2,n+1)o=p[i]*a[i-1][n+1]+o;
    	fp(i,1,n)printf("%.3lf%c",o[i]," 
    "[i==n]);
    	return 0;
    }
    
  • 相关阅读:
    设计模式系列
    Python3 系列之 可变参数和关键字参数
    设计模式系列
    【HANA系列】SAP HANA ODBC error due to mismatch of version
    【FICO系列】SAP FICO FS00修改科目为未清项目管理
    【FIORI系列】SAP OpenUI5 (SAPUI5) js框架简单介绍
    【HANA系列】SAP HANA SQL获取当前日期加若干天后的日期
    【HANA系列】SAP HANA SQL获取本周的周一
    【HANA系列】SAP HANA SQL获取当前日期
    【HANA系列】SAP HANA SQL获取当前日期最后一天
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/10707936.html
Copyright © 2011-2022 走看看