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':' ');
        }
    }
}

 

posted @ 2015-05-17 12:28  雪溯  阅读(153)  评论(0编辑  收藏  举报