[BZOJ 1013][JSOI 2008] 球形空间产生器sphere

Description

有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球

面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。

Input

第一行是一个整数n(1<=N=10)。接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标。每一个实数精确到小数点

后6位,且其绝对值都不超过20000。

Output

有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开。每个实数精确到小数点

后3位。数据保证有解。你的答案必须和标准输出一模一样才能够得分。

Solution

1.考虑构造对于不同的店同样结构的方程。

因为是一个球,所以每个点到球心的距离都相等,

我们设这个半径为R,球心坐标为O(x1,x2,....,xn);

那么对于每一个点P(ai1,ai2,...,ain):我们易得

sqrt ( ( ai1 - x1 ) ^ 2 + ( ai2 - x2 ) ^ 2 + ... + ( ain - xn ) ^2 ) = R;

2.考虑构造方程组

将上式两侧平方再展开,得

-2 ( ai1 * x1 + ai2 * x2 + ... + ain * xn )

+( ai1 ^ 2 + ai2 ^ 2 + ... + ain ^ 2 )

+( x1 ^ 2 + x2 ^ 2 + ... + xn ^ 2 )

= R ^ 2;

这时我们看数据,给出n+1个点,n个点就可以构造该方程组,那多给的一个点是用来干什么的呢(设选第一个点为这个点)?

没错!消掉重复出现的部分( x1 ^ 2 + x2 ^ 2 + ... + xn ^ 2 ) 和R ^ 2,

即令其他所有的点的方程都减掉多的一个点的方程,整理得到其他方程格式为:

2 ( ai1 * x1 + ai2 * x2 + ... + ain * xn )

= ( ai1 ^ 2 + ai2 ^ 2 + ... + ain ^ 2 )

- ( a11 ^ 2 + a12 ^ 2 + ... + a1n ^ 2 )

- 2 ( a11 * x1 + a12 * x2 + ... + a1n * xn ) ;

右侧是常数,左侧展开就是一个愉快的高斯消元方程组,解方程组即可。

这里使用的高斯消元法是一种比较毒瘤的方法,详解参考我的随笔:http://www.cnblogs.com/COLIN-LIGHTNING/p/8981923.html

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std; const int max_n=15;
double a[max_n][max_n+1],v[max_n],del[max_n],x;
int n,w[max_n]; inline double sqr(double x){return x*x;} void init(){
for(int i=1;i<=n;++i)scanf("%lf",&del[i]);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
scanf("%lf",&x);
a[i][n+1]+=sqr(x)-sqr(del[j]);
a[i][j]=2*(x-del[j]);
}
}
} void gauss(){
double eps=1e-6;
for(int i=1;i<=n;++i){//enumerate the equation;
int p=0; //Record the position of the largest number;
double mx=0; //Recording the largest number;
for(int j=1;j<=n;++j)
if(fabs(a[i][j])-eps>mx){
mx=fabs(a[i][j]);p=j;//fabs() returns the absolute value of float;
}
w[i]=p;
for(int j=1;j<=n;++j)
if(i!=j){ //other equations
double t=a[j][p]/a[i][p];
for(int k=1;k<=n+1;++k)//n+1 is important
a[j][k]-=a[i][k]*t;
}
}
for(int i=1;i<=n;++i) v[w[i]]=a[i][n+1]/a[i][w[i]];
for(int i=1;i<=n;++i) printf("%.3lf ",v[i]);
} int main(){
scanf("%d",&n);
init();
gauss();
return 0;
}

[BZOJ 1013][JSOI 2008] 球形空间产生器sphere 题解(高斯消元)的更多相关文章

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

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3584  Solved: 1863[Subm ...

  2. 【BZOJ 1013】球形空间产生器sphere(高斯消元)

    球形空间产生器sphere HYSBZ - 1013 (高斯消元) 原题地址 题意 给出n维的球上的n个点,问原球体球心. 提示 n维球体上两点距离公式\(dist = \sqrt{ (a1-b1)^ ...

  3. 【BZOJ1013】【JSOI2008】球形空间产生器sphere(高斯消元)

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1600  Solved: 860[Submi ...

  4. BZOJ1013 [JSOI2008]球形空间产生器sphere(高斯消元)

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4846  Solved: 2525[Subm ...

  5. BZOJ1013 JSOI2008 球形空间产生器sphere 【高斯消元】

    BZOJ1013 JSOI2008 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点 ...

  6. _bzoj1013 [JSOI2008]球形空间产生器sphere【高斯消元】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1013 保存高斯消元模版. ps,这一题的英文名字是ヨスガノソラ的开发商~^_^ #inclu ...

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

    题目 传送门:QWQ 分析 高斯消元就是个大暴力.... 代码 #include <bits/stdc++.h> using namespace std; ; ; int n; doubl ...

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

    n+1个坐标可以列出n个方程,以二维为例,设圆心为(x,y),给出三个点分别是(a1,b1),(a2,b2),(a3,b3) 因为圆上各点到圆心的距离相同,于是可以列出距离方程 \[ (a1-x)^2 ...

  9. 【BZOJ 1013】 [JSOI2008]球形空间产生器sphere

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

随机推荐

  1. RN热更新

    说白了集成RN业务,就是集成RN离线包,解析并渲染.所以,RN热更新的根本原理就是更换js bundle文件和资源文件,并重新加载,新的内容就完美的展示出来了. 目前市场上出现的3种热更新模式如下:仅 ...

  2. pycharm 调试 scrapy

    http://blog.csdn.net/shijichao2/article/details/61940931

  3. [2017BUAA软工助教]剩余个人作业与deadline

    软件工程剩余作业与deadline 标签(空格分隔): 软件工程 一.个人阅读作业+总结 对软件工程的学习做一个总结. 阅读下列关于软件开发本质和开发方法的博客/文章,结合自己在个人项目/结对编程/团 ...

  4. 四则运算APP,团队项目之需求

    队名:IG.Super 成员:范铭祥,曾威,刘恒,黄伟俊. 一.程序功能需求 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.6 ...

  5. We're Chronos! ----- Meet the team 团队作业 #1

    Meet Us —————————————————La ligne de séparation————————————————— Kane Lim [林珣玙] < PM, Programmer ...

  6. week7:个人博客作业

    这周有2个需要注意的地方. 1,课上 这周是由张翼飞老师讲的课,上周已经听过老师讲的一节课了,这周发现,这个老师讲课是理论+案例,我每节课都在第一排坐的,我不知道其他人是什么想法,我是一上课,老师讲理 ...

  7. Linux命令(十八) 压缩或解压缩文件和目录 gzip gunzip

    目录 1.命令简介 2.常用参数介绍 3.实例 4.直达底部 命令简介 和 zip 命令类似,gzip 用于文件的压缩,gzip压缩后的文件扩展名为 ".gz",gzip默认压缩后 ...

  8. CentOS 修改时区的方法

    study from https://blog.csdn.net/skh2015java/article/details/85007624 第一种 tzselect 输入命令直接选择即可 第二种,直接 ...

  9. Git查看与修改用户名、邮箱

    用户名和邮箱的作用: 用户名和邮箱地址相当于你的身份标识,是本地Git客户端的一个变量,不会随着Git库而改变. 每次commit都会用用户名和邮箱纪录. github的contributions跟你 ...

  10. func_get_args()在php71与php56的区别

    func_get_args() 获取函数的所有参数,返回一个数组 官方:http://www.php.net/manual/en/function.func-get-args.php 但是此函数在ph ...