列表

详情


NC20167. [JSOI2008]球形空间产生器SPHERE

描述

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

输入描述

第一行是一个整数n(1 ≤ N=10)。
接下来的n+1行,每行有n个实数,表示球面上一点的n维坐标。
每一个实数精确到小数点后6位,且其绝对值都不超过20000。

输出描述

有且只有一行,依次给出球心的n维坐标(n个实数),两个实数之间用一个空格隔开。
每个实数精确到小数点 后3位。数据保证有解。你的答案必须和标准输出一模一样才能够得分。

示例1

输入:

2
0.0 0.0
-1.0 1.0
1.0 0.0

输出:

0.500 1.500

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 620K, 提交时间: 2020-06-03 08:55:24

#include<bits/stdc++.h>
using namespace std;
double a[20][20],b[20],c[20][20];
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(fabs(c[j][i])>1E-8) {
				for(int k=1; k<=n; k++)swap(c[i][k],c[j][k]);
				swap(b[i],b[j]);
			}
		}//处理第i行,保证c[i][i]不等于0;
		for(int j=1; j<=n; j++) {
			if(i==j)continue;
			double rate=c[j][i]/c[i][i];
			for(int k=i; k<=n; k++)c[j][k]-=rate*c[i][k];
			b[j]-=b[i]*rate;
		}//将第j个方程中第i个未知数的系数清为0;
	}
	for(int i=1; i<n; i++)
		printf("%.3f ",b[i]/c[i][i]);
	printf("%.3f",b[n]/c[n][n]);
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 504K, 提交时间: 2020-08-29 16:30:00

#include<bits/stdc++.h>
using namespace std;
double a[20][20],b[20],c[20][20];
int n;
int main(){
	cin>>n;
	for(int i=1;i<=n+1;i++){
		for(int j=1;j<=n;j++){
			scanf("%lf",&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(fabs(c[j][i])>1e-8){
				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 rate=c[j][i]/c[i][i];
			for(int k=i;k<=n;k++)  c[j][k]-=c[i][k]*rate;
			b[j]-=b[i]*rate; 
		}
	}
	for(int i=1;i<n;i++)  printf("%.3lf ",b[i]/c[i][i]);
	printf("%.3lf\n",b[n]/c[n][n]);
	return 0;
}

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 408K, 提交时间: 2023-03-07 20:06:01

#include<bits/stdc++.h>
using namespace std;
const int N=20;
double a[N][N],b[N],c[N][N];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n+1;++i) for(int j=1;j<=n;++j) scanf("%lf",&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(fabs(c[j][i]>1e-8)){
				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 rat=c[j][i]/c[i][i];
			for(int k=i;k<=n;++k) c[j][k]-=c[i][k]*rat;
			b[j]-=b[i]*rat;
		}
	}
	for(int i=1;i<=n;++i) printf("%.3f ",b[i]/c[i][i]);
	return 0;
}

上一题