BZOJ.1013.[JSOI2008]球形空间产生器(高斯消元)

题目链接

HDU3571

//824kb	40ms
//HDU3571弱化版 跟那个一比这个太水了,练模板吧。
//列出$n+1$个二次方程后两两相减,就都是一次方程了。
#include <cmath>
#include <cstdio>
#include <algorithm>
const int N=12;

int n;
double A[N][N],B[N],f[N][N];

void Gauss()
{
	for(int mxrow,j=0; j<n; ++j)
	{
		mxrow=j;
		for(int i=j+1; i<n; ++i)
			if(fabs(f[i][j])>fabs(f[mxrow][j])) mxrow=i;
		if(mxrow!=j) std::swap(f[mxrow],f[j]);
		for(int i=j+1; i<n; ++i)
			if(f[i][j])
			{
				double t=f[i][j]/f[j][j];
				for(int k=j; k<=n; ++k)
					f[i][k]-=t*f[j][k];
			}
	}
	for(int i=n-1; ~i; --i)
	{
		for(int j=i+1; j<n; ++j) f[i][n]-=f[i][j]*f[j][n];
		f[i][n]/=f[i][i];
	}
	for(int i=0; i<n; ++i) printf("%.3lf ",f[i][n]);
}

int main()
{
	scanf("%d",&n);
	for(int i=0; i<=n; ++i)
		for(int j=0; j<n; ++j)
			scanf("%lf",&A[i][j]), B[i]+=A[i][j]*A[i][j];
	for(int i=0; i<n; ++i)
		for(int j=0; j<n; ++j) f[i][j]=(A[i][j]-A[i+1][j])*2.0;
	for(int i=0; i<n; ++i) f[i][n]=B[i]-B[i+1];
	Gauss();

	return 0;
}
原文地址:https://www.cnblogs.com/SovietPower/p/8762491.html