题意

给出\(n\)维直角坐标系中\(n + 1\)个点的坐标,它们都在一个\(n\)维球面上,求球心坐标。

题解

设球面上某两个点坐标为\((a_1, a_2, ... a_n)\)和\((b_1, b_2, ... b_n)\),则可以列出方程:

\[(x_1 - a_1)^2 + (x_2 - a_2)^2 + ... + (x_n - a_n)^2 = (x_1 - b_1)^2 + (x_2 - b_2)^2 + ... + (x_n - b_n)^2
\]

括号打开化简得

\[2*(a_1 - b_1)x_1 + 2*(a_2 - b_2)x_2 + ... + 2*(a_n - b_n)x_n = a_1^2 - b_1^2 + a_2^2 - b_2^2 + ... + a_n^2 - b_n^2
\]

这样可得n个方程,然后高斯消元即可。

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long ll;
template <class T>
void read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
} const int N = 20;
int n;
double g[N][N], f[N][N]; int main(){
/*
下面以样例输入为例,模拟一下高斯消元的过程。
样例输入:
2
0.0 0.0
-1.0 1.0
1.0 0.0
*/
scanf("%d", &n);
for(int i = 1; i <= n + 1; i++)
for(int j = 1; j <= n; j++)
scanf("%lf", &g[i][j]);
//首先,我们构造一个矩阵来表示n个方程。
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++){
f[i][j] = 2 * (g[i][j] - g[i + 1][j]);
f[i][n + 1] += g[i][j] * g[i][j] - g[i + 1][j] * g[i + 1][j];
}
/*
上一步中,我们构造出了n个方程,分别是:
2 * x[1] - 2 * x[2] = -2
-4 * x[1] + 2 * x[2] = 1
写成矩阵的形式就是:
2 -2 -2
-4 2 1
这个矩阵存在f[][]数组中。
*/
for(int i = 1; i <= n; i++){
//这次循环,我们以x[i]为主元。
int l = i;
for(int j = i + 1; j <= n; j++)
if(fabs(f[j][i]) > fabs(f[l][i])) l = j;
if(l != i)
for(int j = i; j <= n + 1; j++)
swap(f[i][j], f[l][j]);
//上一步中,我们找出了主元系数绝对值最大的一个方程,把它换到第i行(据说这么做精度能高一些)
/*
程序第一次执行到这里的时候,矩阵变成了
-4 2 1
2 -2 -2
*/
for(int j = n + 1; j >= i; j--) //因为循环内要用到当前的f[i][i],所以f[i][i]最后修改
f[i][j] /= f[i][i]; //将主元系数变为1,方程中其他项系数也等比例扩大/缩小。
for(int j = i + 1; j <= n; j++)
for(int k = n + 1; k >= i; k--) //因为循环内要用到当前的f[j][i],所以f[j][i]最后修改
f[j][k] -= f[i][k] * f[j][i];
/*
将第i个方程的每项系数扩大/缩小,使得主元系数和第j个方程主元系数相同
然后第j个方程 -= 第i个方程,这样第j个方程就消去了当前主元。
*/
/*
程序第一次进行到这一步的时候,矩阵变成了
1 -0.5 -0.25
0 -1 -1.5
第二次则变成了
1 -0.5 -0.25
0 1 1.5
*/
}
for(int i = n; i; i--) //循环到i的时候,f[i][n + 1]表示的已经是最后的解x[i]
for(int j = 1; j < i; j++)
f[j][n + 1] -= f[j][i] * f[i][n + 1]; //将x[i]带入到第j个方程中
for(int i = 1; i <= n; i++)
printf("%.3lf%c", f[i][n + 1], " \n"[i == n]); return 0;
}

BZOJ 1013 | 一份写了一堆注释的高斯消元题解的更多相关文章

  1. BZOJ 3143 Luogu P3232 [HNOI2013]游走 (DP、高斯消元)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3143 (luogu) https://www.luogu.org/pro ...

  2. 【BZOJ 3143】【Hnoi2013】游走 期望+高斯消元

    如果纯模拟,就会死循环,而随着循环每个点的期望会逼近一个值,高斯消元就通过列方正组求出这个值. #include<cstdio> #include<cctype> #inclu ...

  3. BZOJ 2844 albus就是要第一个出场(高斯消元)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2844 题意: 给出一个长度为n的正整数数列A.每次选出A的一个子集进行抑或(空集抑或值为 ...

  4. BZOJ 3270 博物馆 && CodeForces 113D. Museum 期望概率dp 高斯消元

    大前提,把两个点的组合看成一种状态 x 两种思路 O(n^7) f[x]表示在某一个点的前提下,这个状态经过那个点的概率,用相邻的点转移状态,高斯一波就好了 O(n^6) 想象成臭气弹,这个和那个的区 ...

  5. bzoj 1778: [Usaco2010 Hol]Dotp 驱逐猪猡【dp+高斯消元】

    算是比较经典的高斯消元应用了 设f[i]为i点答案,那么dp转移为f[u]=Σf[v]*(1-p/q)/d[v],意思是在u点爆炸可以从与u相连的v点转移过来 然后因为所有f都是未知数,高斯消元即可( ...

  6. [BZOJ 1013][JSOI 2008] 球形空间产生器sphere 题解(高斯消元)

    [BZOJ 1013][JSOI 2008] 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面 ...

  7. BZOJ 1013 & 高斯消元

    题意: 告诉你一个K维球体球面上的K+1个点问球心坐标. sol: 乍一看还以为是K维的二分答案然后判断距离...真是傻逼了...你看乱七八糟的题目做多了然后就会忘记最有用的基本计算... 我们可以看 ...

  8. BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/Judg ...

  9. 【高斯消元】BZOJ 1013: [JSOI2008]球形空间产生器sphere

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

随机推荐

  1. Tetris(俄罗斯方块)

    一天有个小朋友问我OpenGL俄罗斯方块怎么写. 俄罗斯方块分成两部分游戏逻辑和画面渲染. 1. 游戏逻辑 一个简单的俄罗斯方块的逻辑部分需要考虑的情况如下: 1. 方块的表示(坐标, 旋转, 上下左 ...

  2. Mysql Mariadb 密码问题

    mysql密码遗忘和登陆报错问题   mysql登录密码忘记,其实解决办法很简单,只需要在mysql的主配置文件my.cnf里添加一行“跳过授权表”的参数选择即可! 在my.cnf中添加下面一行:[r ...

  3. POJ 3164 Sunscreen (挑战程序设计竞赛的练习题)

    题目:https://vjudge.net/problem/POJ-3614 思路参考这个:https://blog.csdn.net/qq_25576697/article/details/7657 ...

  4. Google hack语法

    基础语法: 1.语法说明: inurl: 在url地址栏中显示的信息页面 intext: 显示在正文信息中的内容页面 site: 限制显示你某个域名的所有页面 filetype: 搜索文件的后缀或者扩 ...

  5. Daily Scrum (2015/10/25)

    今天终于到了周末的尾声,我们的组员也应该正常得投入到工作中了.这天晚上我(符美潇)和PM(潘礼鹏)和两个DEV开了一个小会,讨论一下我们本周的代码编写工作.我们了解到大家的代码阅读工作和相关知识的学习 ...

  6. 冲刺One之站立会议7 /2015-5-20

    2015-5-20 在登陆成功之后要实现的是聊天界面的交互过程,不同的IP进行信息和数据的传递,这方面我们上学期Java实验里面有过相关的内容,我们把它拿过来改了一下格式,试着看能不能成功,目前还没实 ...

  7. TCP/IP,HTTP,HTTPS,WEBSocket协议

    我看看着挺多的,我暂时没时间自己写,有需要的请借鉴 http://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247486927&id ...

  8. 关于mybatis的思考(2)——mybatis映射文件的深入理解

    1.配置文件 mybatis进行持久化操作是以SqlSessionFactory对象为基础的,这个对象是整个数据库映射关系经过编译后的内存镜像. InputStream inputStream = R ...

  9. 最新版ABP 动态WebAPI 日期转json带T的解决方案| ABP DateTIme Json format

    ABP动态webapi返回的json数据中,日期时间带T还有毫秒数的问题,在以往的版本中可以使用下面方法解决: 在XXXAbpWebApiModule中加上下面的代码: 很老的很老的版本有效: pub ...

  10. 转 JS模块化简单实现

    git示例地址:https://github.com/wufenfen/requireJS-Demo.git