BZOJ[1013][JSOI2008]球形空间产生器sphere 高斯消元

33 篇文章 0 订阅
1 篇文章 0 订阅

传送门ber~

公式原题下面都给了….

用题目给的公式能列出 n+1 n + 1 个式子(假设 n=2 n = 2 )

r2=(xix)2+(yiy)2 r 2 = ( x i − x ) 2 + ( y i − y ) 2

发现出现二次项很难搞
可以用后 n n 个式子减去第一个式子消去所有的二次项,产生n个方程
2(x1xi)x+2(y1yi)y=r2+x21+y21x2iy2i 2 ( x 1 − x i ) x + 2 ( y 1 − y i ) y = r 2 + x 1 2 + y 1 2 − x i 2 − y i 2

高斯消元解决即可

代码如下:

#include<algorithm>
#include<ctype.h>
#include<cstdio>
#include<cmath>
#define eps 1e-6///某谷精度要到1e-8
#define N 25
using namespace std;
inline int read(){
    int x=0,f=1;char c;
    do c=getchar(),f=c=='-'?-1:f; while(!isdigit(c));
    do x=(x<<3)+(x<<1)+c-'0',c=getchar(); while(isdigit(c));
    return x*f;
}
double b[N],ans[N],a[N][N];
int n,tmp;
inline void Gauss(){
    for(int i=1;i<n;i++){
        tmp=i;
        for(int j=i+1;j<=n;j++)
            if(fabs(a[j][i])>fabs(a[tmp][i]))
                tmp=j;
        for(int j=1;j<=n+1;j++)
            swap(a[i][j],a[tmp][j]);
        for(int j=i+1;j<=n;j++){
            if(fabs(a[j][i])<=eps) continue;
            double t=a[j][i]/a[i][i];
            for(int l=i+1;l<=n+1;l++)
                a[j][l]=a[j][l]-t*a[i][l];
        }
    }
    for(int i=n;i;i--){
        ans[i]=a[i][n+1]/a[i][i];
        for(int j=i-1;j;j--)
            a[j][n+1]-=ans[i]*a[j][i];///倒推答案
    }
}
int main(){
    n=read();
    for(int i=1;i<=n;i++)
        scanf("%lf",&b[i]);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            scanf("%lf",&a[i][j]);
            a[i][n+1]=a[i][n+1]+b[j]*b[j]-a[i][j]*a[i][j];
            a[i][j]=2.0*(b[j]-a[i][j]);
        }
    Gauss();
    for(int i=1;i<n;i++) printf("%.3lf ",ans[i]);
    printf("%.3lf",ans[n]);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值