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?'\n':' ');

        }

    }

}

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?'\n':' ');

        }

    }

}

 

你可能感兴趣的:(lib)