本文主要是介绍[BZOJ 1013][JSOI2008]球形空间产生器sphere:高斯消元,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
点击这里查看原题
设球心坐标为(x1,x2,x3,…,xn),某个点的坐标为(y1,y2,y3,…,yn),点到球心的距离为L,那么
L2=(y12−2∗x1∗y1+x12)+(y22−2∗x2∗y2+x22)+(y32−2∗x3∗y3+x32)+...+(yn2−2∗xn∗yn+xn2)
同理可以得到其他点与球心距离的式子,n+1个式子相减,刚好消掉所有 xi2 并得到n个式子
/*
User:Small
Language:C++
Problem No.:1013
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
const int M=15;
const double eps=1e-6;
double a[M][M],st[M];
int n;
bool gauss_jordan(){for(int i=0;i<n;i++){int p=i;for(int j=i+1;j<n;j++)if(fabs(a[j][i])>fabs(a[p][i])) p=j;swap(a[i],a[p]);if(fabs(a[i][i])<eps) return 0;//无解或无穷解 for(int j=i+1;j<=n;j++) a[i][j]/=a[i][i];for(int j=0;j<n;j++){if(i==j) continue;for(int k=i+1;k<=n;k++){a[j][k]-=a[j][i]*a[i][k];}}}return 1;
}
int main(){freopen("data.in","r",stdin);//scanf("%d",&n);for(int i=0;i<n;i++) scanf("%lf",&st[i]);for(int i=0;i<n;i++){double x;for(int j=0;j<n;j++){scanf("%lf",&x);a[i][j]=2*(x-st[j]);a[i][n]+=x*x-st[j]*st[j];}}gauss_jordan();for(int i=0;i<n;i++){printf("%.3lf%c",a[i][n],i==n-1?'\n':' ');}return 0;
}
这篇关于[BZOJ 1013][JSOI2008]球形空间产生器sphere:高斯消元的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!