1 solutions

  • 2
    @ 2024-9-8 17:04:02

    由于这是一个N维坐标的球心我们可以假设球心的坐标是x1,x2...xn 我们可以假设题目给出的N+1个N维的坐标我们设为aij

    aija_{ij}代表的是第一个N维的坐标. 由几何知识可知球面上所有的点到达球心的距离相等那么我们可以得出一个式子

    i=1,j=1i=n+1,j=naijxj=C\sum_{i=1,j=1}^{i=n+1,j=n}{a_{ij}}-x_j=C

    可以得到方程:

    (a11x1)2+(a12x2)2...(a1nxn)2=C(a_{11}-x_1)^2+(a_{12}-x_2)^2...(a_{1n}-x_n)^2=C

    (a21x1)2+(a22x2)2...(a2nxn)2=C(a_{21}-x_1)^2+(a_{22}-x_2)^2...(a_{2n}-x_n)^2=C

    ...

    $(a_{n+1,1}-x_{1})^2+(a_{n+1,2}-x_2)^2...(a_{n+1,n}-x_n)^2=C$

    对于这个n+1个未知数,n+1个方程组的题目,该题一定可以解.

    我们可以做点等量代换我们可以给上述式子标号,第一个式子标1,第二个标2依次类推直到第n+1个式子我们可以n+1号式子减去n号,n号减去n-1号,依次类推

    那么我们可以得到式子:

    $2*(a_{1,1}-a_{2,1})x_i=\sum_{j=1}^n{a_{1,j}^2-a_{2,j}^2}$

    $2*(a_{2,1}-a_{3,1})x_i=\sum_{j=1}^n{a_{2,j}^2-a_{3,j}^2}$

    ...

    $2*(a_{n,1}-a_{n+1,1})x_i=\sum_{j=1}^n{a_{n,j}^2-a_{n+1,j}^2}$

    由于题目保证数据一定有解,所以我们在这里就不讨论无解的情况,那对于这样n个方程组n个位置数我们就可以直接用小学的解方程的方法解出当前方程的xix_i那么xix_i即为所求

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 15;
    const double eps = 1e-8;
    
    double a[N][N], b[N], c[N][N];
    //b:是常数,c:系数矩阵,二者一同构成增广矩阵
    int n;
    
    int main() {
        cin >> n;
        for(int i = 1; i <= n + 1; i ++ ) 
            for(int j = 1; j <= n; j ++ ) cin >> a[i][j];
        for(int i = 1; i <= n; i ++ ) 
            for(int j = 1; j <= n; j ++ ) {
                c[i][j] = 2 * (a[i][j] - a[i + 1][j]);
                b[i] += a[i][j] * a[i][j] - a[i + 1][j] * a[i + 1][j];
            }
      //高斯消元
        for(int i = 1; i <= n; i ++ ) {
            for(int j = i; j <= n; j ++ ) 
                if(abs(c[i][j]) > eps) {
                    for(int k = 1; k <= n; k ++ ) swap(c[i][k], c[j][k]);
                    swap(b[i], b[j]);
                }
            for(int j = 1; j <= n; j ++ ) {
                if(i == j) continue;
                double res = c[j][i] / c[i][i];
                for(int k = i; k <= n; k ++ ) c[j][k] -= c[i][k] * res;
                b[j] -= b[i] * res;
            }
        }
        for(int i = 1; i <= n; i ++ ) 
            if(abs(b[i] / c[i][i]) < eps) printf("%.3lf ", abs(b[i] / c[i][i]));
            else printf("%.3lf ", b[i] / c[i][i]);
        return 0;
    }
    
    • 1

    Information

    ID
    488
    Time
    2000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    5
    Accepted
    2
    Uploaded By