BZOJ 1013, 球形空间产生器

博客介绍了如何利用高斯消元法解决BZOJ 1013问题,即根据n+1个点找出n维球面上的球心。通过设定球心坐标并建立与各点距离的方程,通过高斯消元过程求解,强调输出时避免末尾空格。
摘要由CSDN通过智能技术生成

Problem

传送门

Mean

求给定的n+1个点所确定的n维球面的球心。

Analysis

高斯消元裸题。(第一次打没有1A很失望)
可以先设球心坐标,用距离公式表示出其与某点的距离。
用该表达式与其他n个表达式相减即可得到关于球心坐标的n个方程。
接着套用高斯消元即可。
需要注意输出末尾不能有空格

Code

#include<cstdio>
#include<cmath>
const int N=15;
int n,i,j,k;
double t,d[N][N],a[N][N],ans[N];
int main(){
    scanf("%d",&n);
    for(i=0;i<=n;i++) for(j=1;j<=n;j++) scanf("%lf",&d[i][j]);
    for(i=1;i<=n;i++) for(j=1;j<=n;j++) a[i][j]=2*(d[i][j]-d[0][j]),a[i][n+1]+=d[i][j]*d[i][j]-d[0][j]*d[0][j];
    for(i=1;i<=n;i++){
        for(k=i,j=i+1;j<=n;j++) if(fabs(a[j][i])>fabs(a[k][i])) k=j;
        if(k!=i) for(j=i;j<=n+1;j++) t=a[i][j],a[i][j]=a[k][j],a[k][j]=t;
        for(j=i+1;j<=n;j++) for(t=a[j][i]/a[i][i],k=i;k<=n+1;k++) a[j][k]-=a[i][k]*t;
    }
    for(ans[n]=a[n][n+1]/a[n][n],i=n-1;i;i--){
        for(ans[i]=a[i][n+1],j=n;j>i;j--) ans[i]-=ans[j]*a[i][j];
        ans[i]/=a[i][i];
    }
    for(i=1;i<n;i++) printf("%.3f ",ans[i]);
    printf("%.3f",ans[n]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值