bzoj1013 [ JSOI2008 ] -- 高斯消元

得到n+1个方程:

(a1 1-x1)2+(a1 2-x2)2+..+(a1 n-xn)2=r2

(a2 1-x1)2+(a2 2-x2)2+..+(a2 n-xn)2=r2

...

(an+1 1-x1)2+(an+1 2-x2)2+..+(an+1 n-xn)2=r2

将后n个方程减去第一个方程就能到得到n个n个未知数的线性方程,高斯消元即可。

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 #define N 20
 7 double a[N][N],b[N],x;
 8 int i,j,k,n,m;
 9 inline void Guass(){
10     for(int i=1;i<=n;i++){
11         double Ma=-1;int x;
12         for(int j=i;j<=n;j++)if(fabs(a[j][i])>Ma)Ma=fabs(a[j][i]),x=j;
13         if(x!=i)for(int j=1;j<=n+1;j++)swap(a[i][j],a[x][j]);
14         double t=a[i][i];
15         for(int j=1;j<=n+1;j++)a[i][j]/=t;
16         for(int j=1;j<=n;j++)
17         if(i!=j){
18             double t=a[j][i];
19             for(int k=1;k<=n+1;k++)
20             a[j][k]-=t*a[i][k];
21         }
22     }
23 }
24 int main()
25 {
26     scanf("%d",&n);
27     for(i=1;i<=n;i++)scanf("%lf",&b[i]);
28     for(i=1;i<=n;i++){
29         for(j=1;j<=n;j++)
30         scanf("%lf",&x),a[i][j]=(x-b[j])*2,a[i][n+1]+=x*x-b[j]*b[j];
31     }
32     Guass();
33     for(printf("%.3lf",a[1][n+1]),i=2;i<=n;i++)printf(" %.3lf",a[i][n+1]);
34     return 0;
35 }

bzoj1013

时间: 2024-10-07 06:00:26

bzoj1013 [ JSOI2008 ] -- 高斯消元的相关文章

[bzoj1013][JSOI2008]球形空间产生器sphere-题解[高斯消元]

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

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

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

[JSOI2008][BZOJ1013] 球形空间产生器 - 高斯消元

Description 有一个球形空间产生器能够在 n 维空间中产生一个坚硬的球体.现在,你被困在了这个 n 维球体中,你只知道球面上 n+1 个点的坐标,你需要以最快的速度确定这个 n 维球体的球心坐标,以便于摧毁这个球形空间产生器. Input & Output Input 第一行是一个整数 n(1<=N=10) .接下来的 n+1 行,每行有 n 个实数,表示球面上一点的 n 维坐标.每一个实数精确到小数点后 6 位,且其绝对值都不超过20000. Output 有且只有一行,依次给出

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.接

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 1013】【JSOI2008】球形空间产生器sphere 高斯消元基础题

最基础的高斯消元了,然而我把j打成i连WA连跪,考场上再犯这种错误就真的得滚粗了. #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> #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) f

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

Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. HINT 1<=n<=10 提示:给出两个定义:1. 球心:到球面上任意一点距离都相等的点.2. 距离:设两个n为空间上的点A, B的坐标为(a1, a2, …, an), (b1, b2, …, bn),则AB的距离定义为:dist = sqrt( (a1-b1)^2 +

BZOJ 1013 JSOI2008 球形空间产生器sphere 高斯消元

题目大意:给定n维空间下的n+1个点,求这n个点所在的球面的球心 曾经尝试了很久的模拟退火0.0 至今仍未AC 0.0 今天挖粪涂墙怒学了高斯消元-- 我们设球心为X(x1,x2,...,xn) 假设有两点A(a1,a2,...,an)和B(b1,b2,...,bn) 那么我们可以得到两个方程 (x1-a1)^2+(x2-a2)^2+...+(xn-an)^2=r^2 (x1-b1)^2+(x2-b2)^2+...+(xn-bn)^2=r^2 这些方程都是二次的,无法套用高斯消元 但是我们可以做

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

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