高斯消元模板

105 篇文章 0 订阅
13 篇文章 0 订阅
本文介绍了通过高斯消元方法解决模板题Bzoj1013,探讨在dp题目中应用的不便,并展示了如何建立球心坐标与距离方程之间的线性方程组,利用向量简化计算。
摘要由CSDN通过智能技术生成


高斯消元还是很好理解的,于是就找了个模板题做了下:Bzoj1013
不过好像用在那些dp题上面还是很不方便,感觉还是自己太菜了
这个题就很简单了,设出球心坐标 O(O1,O2...On) O ( O 1 , O 2 . . . O n )
写出距离方程式
ni=1(X0,iOi)2=ni=1(X1,iOi)2=...=ni=1(Xn,iOi)2 ∑ i = 1 n ( X 0 , i − O i ) 2 = ∑ i = 1 n ( X 1 , i − O i ) 2 = . . . = ∑ i = 1 n ( X n , i − O i ) 2
两边展开就得到了n个线性方程组,消元即可
偷懒用了向量,其实应该学一学stl的valarray的

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define db double
using namespace std;
int n; db x[20][20],k[20],A[20];
struct vec{
    db v[20];
    inline db& operator[] (int j){ return v[j]; }
    inline vec operator- (vec b){
        vec c;
        for(int i=0;i<20;++i) c[i]=v[i]-b[i];
        return c;
    }
    inline vec operator* (db j){
        vec c;
        for(int i=0;i<20;++i) c[i]=v[i]*j;
        return c;
    }
} s[20];
int main(){
    scanf("%d",&n);
    for(int i=0;i<=n;++i)
        for(int j=1;j<=n;++j) scanf("%lf",x[i]+j);
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            s[i][j]=2*(x[i][j]-x[0][j]);
            k[i]+=-x[0][j]*x[0][j]+x[i][j]*x[i][j];
        }
    }
    for(int i=1;i<=n;++i){
        for(int j=i;j<=n;++j) if(s[j][i]){ swap(s[j],s[i]); break; }
        for(int j=i+1;j<=n;++j){
            k[j]-=k[i]*(s[j][i]/s[i][i]); 
            s[j]=s[j]-s[i]*(s[j][i]/s[i][i]);
        }
    }
    for(int i=n;i;--i){
        for(int j=n;j>i;--j) k[i]-=A[j]*s[i][j];
        A[i]=k[i]/s[i][i];
    }
    for(int i=1;i<=n;++i) printf("%.3lf ",A[i]);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值