首页 > 学院 > 开发设计 > 正文

BZOJ 1013 球形空间产生器 高斯消元

2019-11-08 19:46:33
字体:
来源:转载
供稿:网友

用第一个点与其他n个点构造n个方程 高斯消元即可

#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <vector>#include <map>#include <set>#define MAXN 40#define ls ch[o][0]#define rs ch[o][1]#define key ch[ch[root][1]][0]#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))using namespace std;const double eps=1e-6;const int INF=1e9;inline int read(){ int f=1,t=0;char ch=getchar(); while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){t=t*10+ch-'0',ch=getchar();} return t*f;}//inline void swap(int &a,int &b){int t=a;a=b;b=t;}int n;double a[MAXN][MAXN],s[MAXN];double f(double x){return x*x;}void PRint(){ for(int i=1;i<=n;i++) { for(int j=1;j<=n+1;j++) printf("%.3lf ",a[i][j]); printf("/n"); }}void init(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%lf",&s[i]); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { double t; scanf("%lf",&t); a[i][j]=2*(t-s[j]); a[i][n+1]+=f(t)-f(s[j]); } }}void gaosi(){ int to;double t; for(int i=1;i<=n;i++) { for(to=i;to<=n;to++) if(fabs(a[to][i])>eps) break; if(to!=i)for(int j=1;j<=n+1;j++) swap(a[to][j],a[i][j]); t=a[i][i]; for(int j=1;j<=n+1;j++) a[i][j]/=t; for(int j=1;j<=n;j++) { if(j==i) continue; t=a[j][i]; for(int k=1;k<=n+1;k++) a[j][k]-=t*a[i][k]; } } //print();}int main(){ init(); gaosi(); for(int i=1;i<=n;i++) { if(i!=n) printf("%.3lf " ,a[i][n+1]); else printf("%.3lf/n",a[i][n+1]); } return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表