BZOJ 1013 球形空间产生器sphere 高斯消元

时间:2023-03-09 19:47:44
BZOJ 1013 球形空间产生器sphere 高斯消元

题目链接:

https://www.lydsy.com/JudgeOnline/problem.php?id=1013

题目大意:

有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。

思路:

每两个可以构成一个n个变量的式子,可以构造出n个不同的式子,进行高斯消元求解。

高斯消元模板:

 typedef double Matrix[maxn][maxn];
void gauss(Matrix A, int n)
{
for(int i = ; i < n; i++)
{
int r = i;
for(int j = i + ; j < n; j++)
if(fabs(A[j][i]) > fabs(A[r][i]))r = j;
if(r != i)for(int j = ; j <= n; j++)swap(A[r][j], A[i][j]);
for(int k = i + ; k < n; k++)
{
double f = A[k][i] / A[i][i];
for(int j = i; j <= n; j++)A[k][j] -= f * A[i][j];
}
} for(int i = n - ; i >= ; i--)
{
for(int j = i + ; j < n; j++)
{
A[i][n] -= A[j][n] * A[i][j];
}
A[i][n] /= A[i][i];
}
}
 #include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
#define Max(a, b) ((a) > (b) ? (a) : (b))//禁用于函数,会超时
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Mem(a) memset(a, 0, sizeof(a))
#define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
#define MID(l, r) ((l) + ((r) - (l)) / 2)
#define lson ((o)<<1)
#define rson ((o)<<1|1)
#pragma comment(linker, "/STACK:102400000,102400000")//栈外挂
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} typedef long long ll;
const int maxn = + ;
const int mod = ;//const引用更快,宏定义也更快
const int INF = 1e9;
typedef double Matrix[maxn][maxn];
double a[maxn][maxn];
double tmp[maxn][maxn];
void gauss(Matrix A, int n)
{
for(int i = ; i < n; i++)
{
int r = i;
for(int j = i + ; j < n; j++)
if(fabs(A[j][i]) > fabs(A[r][i]))r = j;
if(r != i)for(int j = ; j <= n; j++)swap(A[r][j], A[i][j]);
for(int k = i + ; k < n; k++)
{
double f = A[k][i] / A[i][i];
for(int j = i; j <= n; j++)A[k][j] -= f * A[i][j];
}
} for(int i = n - ; i >= ; i--)
{
for(int j = i + ; j < n; j++)
{
A[i][n] -= A[j][n] * A[i][j];
}
A[i][n] /= A[i][i];
}
}
int main()
{
int n;
scanf("%d", &n);
for(int i = ; i <= n; i++)
for(int j = ; j < n; j++)scanf("%lf", &a[i][j]);
for(int i = ; i <= n; i++)
{
for(int j = ; j < n; j++)
{
tmp[i - ][n] -= a[][j] * a[][j];
tmp[i - ][n] += a[i][j] * a[i][j];
}
for(int j = ; j < n; j++)
tmp[i - ][j] = 2.0 * (a[i][j] - a[][j]);
}
gauss(tmp, n);
for(int i = ; i < n; i++)
{
if(i == )printf("%.3lf", tmp[i][n]);
else printf(" %.3lf", tmp[i][n]);
}
puts("");
return ;
}