[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]
勤动手,多化简,就可以将问题转换到自己可以解决的领域里面……话说我好懒啊这种题总是不想动手化简……
有一个球形空间产生器能够在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 1013: [JSOI2008]球形空间产生器sphere(高斯消元)
- [BZOJ1013][JSOI2008]球形空间产生器sphere-高斯消元
- BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元
- bzoj 1013: [JSOI2008]球形空间产生器sphere【高斯消元】
- 【高斯消元】BZOJ1013 [JSOI2008]球形空间产生器sphere
- bzoj 1013: [JSOI2008]球形空间产生器sphere 高斯消元
- 【bzoj1013】[JSOI2008]球形空间产生器sphere 高斯消元
- [高斯消元] BZOJ1013: [JSOI2008]球形空间产生器sphere
- [bzoj1013](JSOI2008)球形空间产生器sphere(高斯消元)
- bzoj 1013: [JSOI2008]球形空间产生器sphere 高斯消元
- [高斯消元]BZOJ 1013 [JSOI2008]——球形空间产生器sphere
- bzoj 1013: [JSOI2008]球形空间产生器sphere(高斯消元)
- 【高斯消元】BZOJ1013-[JSOI2008]球形空间产生器sphere
- [bzoj 1013] [JSOI2008]球形空间产生器sphere:高斯消元
- bzoj1013: [JSOI2008]球形空间产生器sphere(高斯消元)
- [JSOI2008] [BZOJ1013] 球形空间产生器sphere - 高斯消元
- bzoj 1013 [JSOI2008]球形空间产生器sphere(高斯消元)
- BZOJ 1013 JSOI2008 球形空间产生器sphere 高斯消元
- 【高斯消元】BZOJ 1013: [JSOI2008]球形空间产生器sphere
- 【BZOJ1013】[JSOI2008]球形空间产生器sphere【高斯消元】