BZOJ 1013--球形空间产生器(高斯消元)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1013--球形空间产生器(高斯消元)相关的知识,希望对你有一定的参考价值。
。。。第一次打高斯消元
题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1013
Solution
先考虑二维的情况:
设圆心A(x,y),给定的点B(a,b)
B 到圆心 A 的距离为 ( a - x ) ^ 2 + ( b - y ) ^ 2 = a ^ 2 - 2ax + x ^ 2 + b ^ 2 - 2by + y^2
假如还有一个点C(a1,b1)
则2(a1-a)x+2(b1-b)y=a1^2-a^2+b1^2-b^2
可以发现:n个点就可以列出 ( n - 1 ) 个不同的方程。
然后用一下高斯消元就行了。。
代码
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<iostream> #define M 20 using namespace std; int n; double pos[M],a[M][M],ans[M]; int main(){ int i,j,k; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%lf",&pos[i]); for(i=1;i<=n;i++){ double temp[M]; for(j=1;j<=n;j++){ scanf("%lf",&temp[j]); a[i][j]=pos[j]-temp[j]; a[i][n+1]+=pos[j]*pos[j]-temp[j]*temp[j]; } a[i][n+1]/=2; } for(i=1;i<=n;i++){ k=0; for(j=i;j<=n;j++) if( fabs(a[j][i])>fabs(a[k][i]) ) k=j; for(j=1;j<=n+1;j++) swap(a[i][j],a[k][j]); for(j=i+1;j<=n;j++){ double temp=-a[j][i]/a[i][i]; for(k=i;k<=n+1;k++) a[j][k]+=a[i][k]*temp; } } for(i=n;i;i--){ for(j=n;j>i;j--) a[i][n+1]-=a[i][j]*ans[j]; ans[i]=a[i][n+1]/a[i][i]; } for(i=1;i<=n;i++) printf("%.3lf%c",ans[i],i==n?‘\n‘:‘ ‘); return 0; }
This passage is made by Iscream-2001.
以上是关于BZOJ 1013--球形空间产生器(高斯消元)的主要内容,如果未能解决你的问题,请参考以下文章
bzoj1013 [JSOI2008]球形空间产生器sphere (高斯消元)
BZOJ 1013 [JSOI2008]球形空间产生器sphere | 高斯消元
[JSOI2008][BZOJ1013] 球形空间产生器 - 高斯消元