【BZOJ】1013: [JSOI2008]球形空间产生器sphere(高斯消元)
http://www.lydsy.com/JudgeOnline/problem.php?id=1013
只要列出方程组就能套高斯来解了。
显然距离相等,所以开不开平方都无所谓。
b表示圆心,可列
sigma((x[i][j]-b[j])^2)=sigma((x[i+1][j]-b[j])^2)
化简得
sigma(2*b[j]*(x[i+1][j]-x[i][j]))=sigma(x[i+1][j]^2-x[i][j]^2)
然后就得到n个等式,而且题目保证有解,就套高斯就行了。
第一次学高斯消元啊,其实就是在一个系数矩阵(叫做啥增广矩阵),每一次将第i行的下边的第i列的系数全部消除,最后得到一个倒三角矩阵,然后回代就是了。
也就是说
1 2 3
2 3 4
的矩阵,当前行在1,我们首先要消掉第二行的第一列,就相当于第一行*2(这个2就是2/1得来),然后第二行减去第一行。
就是消元嘛。。
在这里第i行i列的元素叫做主元素,而我们就是要将所有大于第i行的行将这一列的通过主元素消除。这里需要注意,主元素不要为0,且不要很小,要不然会严重影响精度(就是如果很小的话无法体现分母了)。那么我们在每一次消元时,要找第i列最大的,然后和当前行交换,这样能得到最大的主元素。
高斯中判断无解和无限解的问题还待研究。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }const int N=15;
double A[N][N], a[N][N];
int n;void gauss() {for1(i, 1, n-1) {int pos=i;for1(j, i+1, n) if(abs(A[pos][i])<abs(A[j][i])) pos=j;for1(j, 1, n+1) swap(A[i][j], A[pos][j]);for1(j, i+1, n) {double y=A[j][i]/A[i][i];for1(k, i, n+1) A[j][k]-=y*A[i][k];}}for3(i, n, 1) {for1(j, i+1, n) A[i][n+1]-=A[j][n+1]*A[i][j];A[i][n+1]/=A[i][i];}
}
int main() {read(n);for1(i, 1, n+1) for1(j, 1, n) scanf("%lf", &a[i][j]);for1(i, 1, n) {for1(j, 1, n) A[i][j]=2*(a[i+1][j]-a[i][j]);for1(j, 1, n) A[i][n+1]+=a[i+1][j]*a[i+1][j]-a[i][j]*a[i][j];}gauss();for1(i, 1, n-1) printf("%.3lf ", A[i][n+1]); printf("%.3lf\n", A[n][n+1]);return 0;
}
Description
有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。
Input
第一行是一个整数,n。接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标。每一个实数精确到小数点后6位,且其绝对值都不超过20000。
Output
有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开。每个实数精确到小数点后3位。数据保证有解。你的答案必须和标准输出一模一样才能够得分。
Sample Input
0.0 0.0
-1.0 1.0
1.0 0.0
Sample Output
HINT
数据规模:
对于40%的数据,1<=n<=3
对于100%的数据,1<=n<=10
提示:给出两个定义:
1、 球心:到球面上任意一点距离都相等的点。
2、 距离:设两个n为空间上的点A, B的坐标为(a1, a2, …, an), (b1, b2, …, bn),则AB的距离定义为:dist = sqrt( (a1-b1)^2 + (a2-b2)^2 + … + (an-bn)^2 )
Source
【BZOJ】1013: [JSOI2008]球形空间产生器sphere(高斯消元)相关推荐
- BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元
1013: [JSOI2008]球形空间产生器sphere Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/Judg ...
- BZOJ 1013: [JSOI2008]球形空间产生器sphere( 高斯消元 )
可以得到N条N元一次方程, 高斯消元就OK了..时间复杂度O(N3) ----------------------------------------------------------------- ...
- BZOJ 1013 JSOI2008 球形空间产生器sphere 高斯消元
题目大意:给定n维空间下的n+1个点,求这n个点所在的球面的球心 以前尝试了非常久的模拟退火0.0 至今仍未AC 0.0 今天挖粪涂墙怒学了高斯消元-- 我们设球心为X(x1,x2,...,xn) 如 ...
- bzoj 1013: [JSOI2008]球形空间产生器sphere(高斯消元)
1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec Memory Limit: 162 MB Submit: 5598 Solved: 2943 [Su ...
- luogu P4035 [JSOI2008]球形空间产生器(高斯消元 / 模拟退火)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 数据范围只开到了10,而且是经典的力学结构,所以我们可以用模拟退火,可以做一下 nnn 维的正交分解h ...
- 【BZOJ】1013 [JSOI2008]球形空间产生器sphere
[算法]高斯消元 [题解] 建矩阵; for i 找到同列绝对值最大数字; 交换; for k(行) j(列)(倒序) 除法; for i(倒序) for j 减去已知元素 除到右边; #incl ...
- BZOJ 1013 球形空间产生器(高斯消元)
时间限制: 1 Sec 内存限制: 128 MB 提交: 11 解决: 7 [提交] [状态] [命题人:admin] 题目描述 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被 ...
- bzoj1013,luogu4035-[JSOI2008]球形空间产生器【高斯消元】
正题 题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3534 https://www.luogu.org/problem/P4035 题 ...
- BZOJ.1013.[JSOI2008]球形空间产生器(高斯消元)
题目链接 HDU3571 //824kb 40ms //HDU3571弱化版 跟那个一比这个太水了,练模板吧. //列出$n+1$个二次方程后两两相减,就都是一次方程了. #include <c ...
最新文章
- Java开发必须掌握的线上问题排查命令
- 【干货】极简体验+免费真的万能嘛?北森Saas第一坑:免费
- python的jsonpath_python 提取json数据的jsonPath介绍及简单使用
- 独家!支付宝小程序技术架构全解析
- [Unity菜鸟] Time
- java cpu过高排查_涨薪秘籍:JAVA项目排查cpu负载过高
- [vue] 你了解什么是函数式组件吗?
- puppet成长日记二 Package资源详细介绍及案例分析
- ai电磁组属于什么组_飞思卡尔智能车电磁组分区算法介绍
- Entity Framework 4 in Action读书笔记——第六章:理解实体的生命周期(一)
- 【CCCC】L2-004 这是二叉搜索树吗? (25分),二叉搜索树前序遍历
- Windows系统、下的MySQL、版本升级、实操
- java中compar_1.java中Comparor与Comparable的问题
- 安卓手机解锁密码忘了如何解锁
- 北京智能机器人为游客指路;日本研发出可识别背影的人工智能
- Excel合并表格之vba
- java二进制保存图片_Java中如何把图片转换成二进制流
- 【R语言】常用基本函数
- 用WinSCP登录路由器并传入文件及改文件权限
- Eclipse软件使用教程