您的位置:首页 > Web前端 > JavaScript

[BZOJ1013][JSOI2008][高斯消元]球形空间产生器sphere

2014-05-04 19:52 691 查看
[Problem Description]
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。
[Algorithm]
高斯消元
[Analysis]
n维空间???额略蛋疼啊……其实n维空间中距离的计算方法和三维二维是一样的……sqrt((a1 - b1) ^ 2 + (a2 - b2) ^ 2 + ... + (an - bn) ^ 2)。
所以对于每一个k(1 <= k <= n + 1),可以得出这样的式子:
Sigma Xi ^ 2 - 2 * Xi * Ak,i + Ak,i ^
2 = C (1 <= i <= n)

这里的C是一个常数。但是这样还不方便求解方程。所以将相邻的两个式子相减,就可以的到
Sigma 2 * (Ak,i - Ak + 1,i) * Xi =
Sigma Ak,i ^ 2 - Ak - 1,i ^ 2 

这样就是标准的非齐次线性方程了……高斯消元可解
[Pay Attention]
勤动手,多化简,就可以将问题转换到自己可以解决的领域里面……话说我好懒啊这种题总是不想动手化简……
[code]/**************************************************************
Problem: 1013
User: gaotianyu1350
Language: C++
Result: Accepted
Time:0 ms
Memory:1280 kb
****************************************************************/

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
using namespace std;

#define MAXN 20

double ori[MAXN][MAXN];
double a[MAXN][MAXN];
int n;

inline void Calc()
{
for (int i = 1; i < n; i++)
{
for (int j = i + 1; j <= n; j++)
for (int k = n + 1; k >= i; k--)
a[j][k] -= a[j][i] / a[i][i] * a[i][k];
}
a[n + 1][n + 2] = -1;
for (int i = n; i >= 1; i--)
{
a[i][n + 2] = 0;
for (int j = i + 1; j <= n + 1; j++)
a[i][n + 2] -= a[j][n + 2] * a[i][j];
a[i][n + 2] /= a[i][i];
}
}

int main()
{
//freopen("input.txt", "r", stdin);
memset(a, 0, sizeof(a));
scanf("%d", &n);
for (int i = 1; i <= n + 1; i++)
for (int j = 1; j <= n; j++)
scanf("%lf", &ori[i][j]);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
a[i][j] = 2 * (ori[i][j] - ori[i + 1][j]),
a[i][n + 1] += ori[i][j] * ori[i][j] - ori[i + 1][j] * ori[i + 1][j];
Calc();
for (int i = 1; i < n; i++)
printf("%.3f ", a[i][n + 2]);
printf("%.3f\n", a
[n + 2]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BZOJ JSOI 高斯消元