bzoj 1013 //1013: [JSOI2008]球形空间产生器sphere //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=1013
更多题解,详见https://blog.csdn.net/mrcrack/article/details/90228694BZOJ刷题记录
洛谷 26ms / 808.00KB / 1.02KB C++
bzoj 1013 2019-10-24
824 kb | 40 ms | C++/Edit | 1430 B |
//1013: [JSOI2008]球形空间产生器sphere
//在线测评地址https://www.luogu.org/problem/P4035
//为什么n维需要n+1个点,以2维为例
/*
(x-x0)^2+(y-y0)^2=R^2
有3个未知数x0,y0,R,故需3个方程,需2+1=3个点
*/
//此文https://www.luogu.org/problemnew/solution/P4035 作者: 海阔天空818 更新时间: 2019-07-01 20:16思路不错,摘抄如下
/*
本人实际情况:公式推导成功,化成矩阵行列式成功,消成上三角没有问题,在最后一刻,求解答案时,没想清楚,功亏一溃。只好看题解,不过自我感觉,还是进步很快。2019-9-26
*/
//按自己的理解进行编码。样例通过,提交AC.2019-9-27
#include
#include
#define maxn 15
double a[maxn][maxn],b[maxn],c[maxn][maxn];
int n;
void init(){
int i,j;
scanf("%d",&n);
for(i=1;i<=n+1;i++)
for(j=1;j<=n;j++)
scanf("%lf",&a[i][j]);
memset(c,0,sizeof(c)),memset(b,0,sizeof(b));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
c[i][j]+=2*(a[i+1][j]-a[i][j]),b[i]+=a[i+1][j]*a[i+1][j]-a[i][j]*a[i][j];
}
void swap(double *a,double *b){
double t;
t=*a,*a=*b,*b=t;
}
void guass(){
int i,j,k;
double rate;
for(i=1;i<=n;i++){
if(c[i][i]<=1e-8||c[i][i]>=-1e-8)//目标c[i][i]!=0 if(c[i][i]<=1e-8||c[i][i]>=-1e-8)写法等价于fabs(c[i][i])<=1e-8
for(j=i+1;j<=n;j++)
if(c[j][i]>1e-8||c[j][i]<-1e-8){//c[j][i]!=0
for(k=1;k<=n;k++)swap(&c[i][k],&c[j][k]);
swap(&b[i],&b[j]);
break;
}
for(j=1;j<=n;j++){
if(j==i)continue;
rate=c[j][i]/c[i][i];
for(k=1;k<=n;k++)c[j][k]-=c[i][k]*rate;
b[j]-=b[i]*rate;
}
}
printf("%.3lf",b[1]/c[1][1]);
for(i=2;i<=n;i++)printf(" %.3lf",b[i]/c[i][i]);
printf("\n");
}
int main(){
init();
guass();
return 0;
}