bzoj 1013 //1013: [JSOI2008]球形空间产生器sphere

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思路不错,摘抄如下
/*

bzoj 1013 //1013: [JSOI2008]球形空间产生器sphere_第1张图片

bzoj 1013 //1013: [JSOI2008]球形空间产生器sphere_第2张图片

 

bzoj 1013 //1013: [JSOI2008]球形空间产生器sphere_第3张图片

bzoj 1013 //1013: [JSOI2008]球形空间产生器sphere_第4张图片

bzoj 1013 //1013: [JSOI2008]球形空间产生器sphere_第5张图片

bzoj 1013 //1013: [JSOI2008]球形空间产生器sphere_第6张图片

bzoj 1013 //1013: [JSOI2008]球形空间产生器sphere_第7张图片

本人实际情况:公式推导成功,化成矩阵行列式成功,消成上三角没有问题,在最后一刻,求解答案时,没想清楚,功亏一溃。只好看题解,不过自我感觉,还是进步很快。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;
}

你可能感兴趣的:(跟着大佬学算法)