题解 P4035 【[JSOI2008]球形空间产生器】

Solution [JSOI2008]球形空间产生器

题目大意:在\(n\)维空间中给定\(n + 1\)个点,求到\(n + 1\)个点的欧几里得距离相等的点

高斯消元



分析:

假设我们有点\((x_1,x_2,x_3, \dots,x_n)\),到点\((a_1,a_2,a_3, \dots,a_n)\),\((b_1,b_2,b_3, \dots,b_n)\)相等

有\(\sqrt{\sum(x_i-a_i)^2}=\sqrt{\sum(x_i-b_i)^2}\)

显然根号下都是非负数

\(\sum(x_i-a_i)^2=\sum(x_i-b_i)^2\)

平方差

\(\sum(2x_i-a_i-b_i)(b_i-a_i)=0\)

展开式子

\(\sum(-2a_ix_i+2b_ix_i+{a_i}^2-{b_i}^2)=0\)

整理得

\(\sum x_i \cdot (-2a_i+2b_i)=\sum({b_i}^2-{a_i}^2)\)

然后这就是一个\(n\)元一次方程了,我们可以\(n^2\)求出\(n\)元一次方程组,然后对这个方程组进行高斯消元即可,为了数值稳定性每次选取绝对值最大的作为主元,取前\(n\)项回带即可

\(Trick:\)一个\(n\)维的数组实际上每个元素都是指针,指向\(n-1\)维的数组,\(0\)维自然就是元素啦,因此我们可以直接交换指针,做到常数时间内交换方程组两项

又一个\(Trick:\)输出调试信息可以用\(cerr\),以避免忘记删除调试信息而\(GG\)

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
typedef double type;
const int maxn = 16;
type val[maxn][maxn],mat[maxn * maxn][maxn];
int n,tot;
inline void add(int a,int b){
    tot++;
    for(int i = 1;i <= n;i++)
        mat[tot][i] = -2 * val[a][i] + 2 * val[b][i],mat[tot][n + 1] += val[b][i] * val[b][i] - val[a][i] * val[a][i];
}
inline void gauss(){
    for(int i = 1;i < n;i++){
        for(int j = i + 1;j <= tot;j++)
            if(fabs(mat[j][i]) > fabs(mat[i][i]))swap(mat[i],mat[j]);
        for(int k = i + 1;k <= tot;k++){
            type f = mat[k][i] / mat[i][i];
            for(int j = i;j <= n + 1;j++)
                mat[k][j] -= mat[i][j] * f;
        }
    }
    for(int i = n;i >= 1;i--){
        for(int j = i + 1;j <= n;j++)
            mat[i][n + 1] -= mat[j][n + 1] * mat[i][j];
        mat[i][n + 1] /= mat[i][i];
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin >> n;
    for(int i = 1;i <= n + 1;i++)
        for(int j = 1;j <= n;j++)
            cin >> val[i][j];
    for(int i = 1;i <= n + 1;i++)
        for(int j = i + 1;j <= n + 1;j++)
            add(i,j);
    gauss();
    cout << setprecision(3) << fixed;
    for(int i = 1;i <= n;i++)
        cout << mat[i][n + 1] << ' ';
    cout << '\n';
    return 0;
}

原文地址:https://www.cnblogs.com/colazcy/p/11712273.html

时间: 2024-11-23 17:24:54

题解 P4035 【[JSOI2008]球形空间产生器】的相关文章

P4035 [JSOI2008]球形空间产生器

P4035 [JSOI2008]球形空间产生器 题目 题目大意 给出n维空间上的n+1个点,且这些店都在一个圆的表面,求圈心坐标. 定义: 球心:到球面上任意一点距离都相等的点. 两点间距离公式 \[ A(x_1,x_2,x_3,x_4,\cdots x_n) \] \[ B(y_1,y_2,y_3,y_4,\cdots y_n) \] \[ distance:\sqrt[2]{\sum_{i=1}^{n}(x_i-y_i)^2} \] 题目看上去应该就是解方程了. 我们可以使用gauss消元法

BZOJ1013: [JSOI2008]球形空间产生器sphere

1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4485  Solved: 2341[Submit][Status][Discuss] Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. Input 第一行是一个整数n(1

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

bzoj 1013 [JSOI2008]球形空间产生器sphere(高斯消元)

1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3584  Solved: 1863[Submit][Status][Discuss] Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. Input 第一行是一个整数,n.接

线性代数(高斯消元):JSOI2008 球形空间产生器sphere

JSOI2008 球形空间产生器sphere [题目描述] 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. [输入格式] 第一行是一个整数,n.接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标.每一个实数精确到小数点后6位,且其绝对值都不超过20000. [输出格式] 有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空

[JSOI2008]球形空间产生器sphere

1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3131  Solved: 1644[Submit][Status][Discuss] Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. Input 第一行是一个整数,n.接

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

题链:http://www.lydsy.com/JudgeOnline/problem.php?id=1013 1013: [JSOI2008]球形空间产生器sphere 时间限制: 1 Sec  内存限制: 162 MB 提交: 3063  解决: 1607 [提交][][] 题目描述 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. 输入 第一行

bzoj千题计划104:bzoj1013: [JSOI2008]球形空间产生器sphere

http://www.lydsy.com/JudgeOnline/problem.php?id=1013 设球心(x1,x2,x3……) 已知点的坐标为t[i][j] 那么 对于每个i满足 Σ (t[i][j]-x[j])^2 = Σ (t[0][j]-x[j])^2 化简开就是 2*(t[0][j]-t[i][j])*x[j] = t[0][j]^2-t[i][j]^2 n个方程n个未知数 高斯消元 #include<cmath> #include<cstdio> #includ

1013: [JSOI2008]球形空间产生器sphere

1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 6517  Solved: 3381[Submit][Status][Discuss] Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. Input 第一行是一个整数n(1<