1. 程式人生 > >BZOJ 1013 [JSOI2008]球形空間產生器sphere | 高斯消元

BZOJ 1013 [JSOI2008]球形空間產生器sphere | 高斯消元

math clas def 做了 bzoj n) class div com

題目:

http://www.lydsy.com/JudgeOnline/problem.php?id=1013


題解:

考慮二維的我們可以明白一個道理:

兩個點左邊可以表示一個方程,然後用兩兩方程相減得到一個一次方程

這樣用高斯消元就可以做了

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 13
using 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 | 高斯消元