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?'
    ':' ');
            }
        }
    }
    
  • 相关阅读:
    基本技能训练之线程
    关于UEditor的使用配置(图片上传配置)
    PAT 乙级练习题1002. 写出这个数 (20)
    codeforces 682C Alyona and the Tree DFS
    codeforces 681D Gifts by the List dfs+构造
    codeforces 678E Another Sith Tournament 概率dp
    codeforces 680E Bear and Square Grid 巧妙暴力
    codeforces 678D Iterated Linear Function 矩阵快速幂
    codeforces 679A Bear and Prime 100 交互
    XTUOJ 1248 TC or CF 搜索
  • 原文地址:https://www.cnblogs.com/xuesu/p/4509456.html
Copyright © 2011-2022 走看看