您的位置:首页 > 其它

ZOJ 3645 BiliBili 高斯消元 难度:1

2015-05-17 12:28 267 查看
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':' ');
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: