zoukankan      html  css  js  c++  java
  • ZOJ 3645 BiliBili 高斯消元 难度:1

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4835

    由题意,有:

    (x1-x11)^2 + (x2-x12)^2 ... = D[1]^2

    (x1-x21)^2 + (x2-x22)^2 ... = D[2]^2

    ...

    (x1-x12,1)^2 + (x2-x12,2)^2 ... = D[12]^2

    所以

    -x1^2 + x11 * x1 .... = (-D[12] ^ 2 + x11` ^ 2 + x12 ^ 2 ....)/2

    -x1^2 + x21 * x1 .... = (-D[22] ^ 2 + x21 ^ 2 + x22 ^ 2 ....)/2

    高斯消元即可

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    const int maxn = 15;
    double g[maxn][maxn],x[maxn];
    double eps = 1e-8;
    void debug(){
        for(int i=0;i<12;i++){
            for(int j=0;j<12;j++){
                printf("%.2f%c",g[i][j],j==11?'
    ':' ');
            }
        }
    }
    void gauss(){
        memset(x,0,sizeof x);
        for(int i = 0;i < 12;i++){
            g[i][11] = -g[i][11] * g[i][11];
        }
        for(int i = 0;i < 12;i++){
            for(int j = 0;j < 11;j++){
                g[i][11] += g[i][j] * g[i][j];
            }
        }
        for(int i = 0;i < 12;i++){
            g[i][11] /= 2;
        }
    
        for(int i = 0;i < 11;i++){
            for(int j = 0;j < 12;j++){
                g[i][j] -= g[11][j];
            }
        }
        for(int i = 0;i < 11;i++){
            //puts("begin");
           // debug();
            int maxr = i;
            for(int j = i;j < 11;j++){
                if(fabs(g[j][i]) > fabs(g[maxr][i])){
                    maxr=j;
                }
            }
            if(maxr != i){
                for(int j = i;j < 12;j++){
                    swap(g[i][j],g[maxr][j]);
                }
            }
           // puts("after swap");
           // debug();
            for(int j = i + 1;j < 11;j++){
                if(g[j][i] != 0){
                    double tmp = -g[j][i]/g[i][i];
                    for(int k = i;k < 12;k++){
                        g[j][k] += tmp * g[i][k];
                    }
                }
            }
        }
        for(int i = 10;i >= 0;i--){
            double tmp = 0;
            for(int j = i + 1;j < 11;j++){
                tmp += g[i][j] * x[j];
            }
            x[i] = (g[i][11] - tmp) / g[i][i];
        }
    }
    int main(){
        int T;
        scanf("%d",&T);
        while(T--){
            for(int i = 0;i < 12;i++){
                for(int j = 0;j < 12;j++){
                    scanf("%lf",g[i]+j);
                }
            }
            gauss();
            for(int i=0;i<11;i++){
                printf("%.2f%c",fabs(x[i])<eps?0:x[i],i==10?'
    ':' ');
            }
        }
    }
    
  • 相关阅读:
    EFCore数据库迁移命令
    EF基本操作
    EF执行存储过程
    [vue]element-ui使用
    [vue]vue-router的使用
    [vue]使用webpack打包
    [vue]插槽与自定义事件
    [vue]计算属性
    [vue]axios异步通信
    [vue]组件
  • 原文地址:https://www.cnblogs.com/xuesu/p/4509456.html
Copyright © 2011-2022 走看看