bzoj1013,luogu4035-[JSOI2008]球形空间产生器【高斯消元】

正题

题目链接:
https://www.lydsy.com/JudgeOnline/problem.php?id=3534
https://www.luogu.org/problem/P4035


题目大意

一个 n n n维平面的元,给出圆表面上的 n + 1 n+1 n+1个坐标,求圆心位置。


解题思路

对于圆心的第 i i i维位置 x i x_i xi ∑ j = 0 n ( a i , j − x i ) 2 = C \sum_{j=0}^n (a_{i,j}-x_i)^2=C j=0n(ai,jxi)2=C
我们将以上公式两两做差,然后可以消去常数 C C C
∑ j = 1 n ( a i , j 2 − a i + 1 , j 2 − 2 x j ( a i , j − a i + 1 , j ) ) = 0 ( i ∈ [ 1.. n ] ) \sum_{j=1}^n (a_{i,j}^2-a_{i+1,j}^2-2x_j(a_{i,j}-a_{i+1,j}))=0(i\in[1..n]) j=1n(ai,j2ai+1,j22xj(ai,jai+1,j))=0(i[1..n])
然后移一下
∑ j = 1 n 2 ( a i , j − a i + 1 , j ) x j = ∑ j = 1 n ( a i , j 2 − a i + 1 , j 2 ) ( i ∈ [ 1.. n ] ) \sum_{j=1}^n 2(a_{i,j}-a{i+1},j)x_j=\sum_{j=1}^n(a_{i,j}^2-a_{i+1,j}^2)(i\in[1..n]) j=1n2(ai,jai+1,j)xj=j=1n(ai,j2ai+1,j2)(i[1..n])
然后高斯消元即可。


c o d e code code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=20;
int n;
double r[N][N],a[N][N],b[N];
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n+1;i++)
		for(int j=1;j<=n;j++)
			scanf("%lf",&r[i][j]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			a[i][j]=2*(r[i][j]-r[i+1][j]),
			b[i]+=r[i][j]*r[i][j]-r[i+1][j]*r[i+1][j];
	for(int i=1;i<=n;i++){
		int z=i;
		for(int j=i+1;j<=n;j++)
			if(fabs(a[j][i])>fabs(a[z][i]))
				z=j;
		for(int j=1;j<=n;j++)
			swap(a[i][j],a[z][j]);
		swap(b[i],b[z]);
		for(int j=1;j<=n;j++){
			if(i==j) continue;
			double rate=a[j][i]/a[i][i];
			for(int k=i;k<=n;k++)
				a[j][k]-=rate*a[i][k];
			b[j]-=rate*b[i];
		}
	}
	for(int i=1;i<=n;i++)
		printf("%.3lf ",b[i]/a[i][i]);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值