题目:
http://www.lydsy.com/JudgeOnline/problem.php?id=1013
题解:
考虑二维的我们可以明白一个道理:
两个点左边可以表示一个方程,然后用两两方程相减得到一个一次方程
这样用高斯消元就可以做了
#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#define N 13using namespace std;int n,m;double c[N][N],f[N][N],ans[N];inline void Gauss(){ ???for (int i=1;i<=n;i++) ???{ ???int l=i; ???for (int j=l+1;j<=n;j++) ???????if (fabs(f[l][i]) < fabs(f[j][i])) l=j; ???if (l!=i) ???????for (int j=i;j<=m;j++) ???????swap(f[l][j],f[i][j]); ???for (int j=i+1;j<=n;j++) ???{ ???????double temp=f[j][i]/f[i][i]; ???????for (int k=i;k<=m;k++) ???????f[j][k]=f[j][k]-f[i][k]*temp; ???} ???} ???for (int i=n;i>=1;i--) ???{ ???double t=f[i][m]; ???for (int j=n;j>i;j--) ???????t-=ans[j]*f[i][j]; ???ans[i]=t/f[i][i]; ???}}int main(){ ???scanf("%d",&n);m=n+1; ???for (int i=0;i<=n;i++) ???for (int j=1;j<=n;j++) ???????scanf("%lf",&c[i][j]); ???for (int i=1;i<=n;i++) ???{ ???int j=i-1;double d=0; ???for (int k=1;k<=n;k++) ???{ ???????f[i][k]=(c[i][k]-c[j][k])*2; ???????d+=c[i][k]*c[i][k]-c[j][k]*c[j][k]; ???} ???f[i][m]=d; ???} ???Gauss(); ???for (int i=1;i<=n;i++) ???if (i<n) printf("%.3lf ",ans[i]); ???else printf("%.3lf\n",ans[i]); ???return 0;}
BZOJ 1013 [JSOI2008]球形空间产生器sphere | 高斯消元
原文地址:https://www.cnblogs.com/mrsheep/p/8258597.html