列n个距离公式,消去二次方项,然后大模拟列个方程,gauss消元解一下即可。
我原来背的gauss消元的板子竟然会爆double。。。于是找的hzwer学长的板子抄了抄。。。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int maxn=25; const double eps=1e-5; int n; int p[maxn]; double a[maxn][maxn],init[maxn][maxn],ans[maxn]; void gauss_elimination() { int now=1; for(int i=1;i<=n;i++,now++) { int tmp; for(tmp=now;tmp<=n;tmp++) if(fabs(a[tmp][i])>0)break; if(tmp!=now) for(int j=1;j<=n+1;j++) swap(a[tmp][j],a[now][j]); double key=a[now][i]; for(int i=1;i<=n+1;i++) a[now][i]/=key; for(int j=1;j<=n;j++)if(now!=j) { key=a[j][i]; for(int k=1;k<=n+1;k++) a[j][k]-=key*a[now][k]; } } for(int i=1;i<n;i++)printf("%.3lf ",a[i][n+1]); printf("%.3lf",a[n][n+1]); } int main() { scanf("%d",&n); for(int i=1;i<=n+1;i++) { for(int j=1;j<=n;j++) scanf("%lf",&init[i][j]); } for(int i=1;i<=n;i++) a[1][i]+=-2.0*init[1][i],a[1][n+1]-=init[1][i]*init[1][i]; for(int i=2;i<=n;i++) { for(int j=1;j<=n;j++) a[i-1][j]-=-2.0*init[i][j],a[i-1][n+1]+=init[i][j]*init[i][j]; for(int j=1;j<=n;j++) a[i][j]+=-2.0*init[i][j],a[i][n+1]-=init[i][j]*init[i][j]; } for(int i=1;i<=n;i++) a[n][i]-=-2.0*init[n+1][i],a[n][n+1]+=init[n+1][i]*init[n+1][i]; gauss_elimination(); return 0; }
最后
以上就是诚心小伙最近收集整理的关于BZOJ 1013 [JSOI2008]球形空间产生器 - 高斯消元的全部内容,更多相关BZOJ内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复