P4035 [JSOI2008]球形空间产生器

题目

P4035 [JSOI2008]球形空间产生器

分析

发现可以列出一个方程组,于是高斯消元求解。

代码

#include<bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &x){
	x=0;char ch=getchar();bool f=false;
	while(!isdigit(ch)){if(ch=='-'){f=true;}ch=getchar();}
	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	x=f?-x:x;
	return ;
}
template <typename T>
inline void write(T x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10^48);
	return ;
}
#define ll long long
#define ull unsigned long long
#define inc(x,y,mod) (((x)+(y))>=(mod)?(x)+(y)-(mod):(x)+(y))
#define dec(x,y,mod) ((x)-(y)<0?(x)-(y)+(mod):(x)-(y))
#define rep(i,x,y) for(int i=(x);i<=(y);i++)
#define dep(i,y,x) for(int i=(y);i>=(x);i--)
const int N=15,NM=62,M=2e5+5,INF=1e9+7;
const double eps=1e-8;
int n,m;
double a[N][N],d[N][N];
void Gauss(){
	for(int i=1,t;i<=n;i++){
		t=i;
		for(int j=i;j<=n;j++) if(fabs(d[j][i])>fabs(d[t][i])) t=j;
		if(t!=i) swap(d[t],d[i]);
		if(fabs(d[t][i])<eps) return ;
		for(int j=1;j<=n;j++){
			if(i==j) continue;
			double tmp=d[j][i]/d[i][i];
			for(int k=i+1;k<=n+1;k++) d[j][k]-=tmp*d[i][k];
		}
	}
	for(int i=1;i<=n;i++) d[i][n+1]/=d[i][i];
	return ;
}
signed main(){
	read(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++) d[i][j]=2*(a[i][j]-a[i+1][j]);
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) d[i][n+1]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j];
	Gauss();
	for(int i=1;i<=n;i++) printf("%.3lf ",d[i][n+1]);
	return 0;
}


原文地址:https://www.cnblogs.com/Akmaey/p/15168182.html