bzoj1013高斯消元

比较裸的解线性方程组。 
设球心坐标为 (x1,x2,...,xn) ,根据定义可以列出方程组: 

k=1N(xkaik)2=k=1N(xkajk)2

展开后移项相减,得到 
k=1N2(aikajk)xk=a2ika2jk

于是变成一个n个变量的线性方程组,根据题意,这个方程组总是洽定的。 


#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const double eps=1e-6;
double a[22][22],p[22];
int n;
void init()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++) scanf("%lf",&p[i]);
	double t;
	for (int i=1;i<=n;i++) 
		for (int j=1;j<=n;j++) 
		{
			scanf("%lf",&t);
			a[i][j]=2*(t-p[j]);
			a[i][n+1]+=t*t-p[j]*p[j];
		}
}
void gauss()
{
	int now=1,to;double t;
	for (int i=1;i<=n;i++)
	{
		for (to=now;to<=n;to++) if (fabs(a[to][i])>eps) break;
		if (to>n) continue;	
		
		if (to!=now) 
		for (int j=1;j<=n+1;j++) swap(a[to][j],a[now][j]);
		t=a[now][i];
		for (int j=1;j<=n+1;j++) a[now][j]/=t;
		for (int j=1;j<=n;j++) 
			if (j!=now)
			{
				t=a[j][i];
				for (int k=1;k<=n+1;k++) a[j][k]-=t*a[now][k];
			}
		now++;	
	}
}
int main()
{
	init();
	gauss();
	for (int i=1;i<n;i++) printf("%.3lf ",a[i][n+1]);
	printf("%.3lf\n",a[n][n+1]);
	return 0;
}
总结

1:高斯消元很多就是想办法,将题目转化为线性方程组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值