码迷,mamicode.com
首页 > Web开发 > 详细

[JSOI2008] 球形空间产生器sphere

时间:2019-01-29 20:24:35      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:algo   简单   names   高斯   其他   return   stream   ace   n+1   

题目链接:戳我

很简单啊。。。就是根据题目意思列出n+1个方程来。。。因为是n+1元二次方程组,所以我们用一个方程和其他n个方程列成等式,就可以把球心的二次项消掉了。。。剩下的就是高斯消元了。。。。

为了方便,我们可以让去配平其他n个方程的那个方程是第n+1个。这样好写一点,不容易出锅。。。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
double a[15][15],val[15][15],ans[15];
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    scanf("%d",&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++)
            val[i][n+1]+=a[n+1][j]*a[n+1][j]-a[i][j]*a[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            val[i][j]=2*(a[n+1][j]-a[i][j]);
    for(int i=1;i<=n;i++)
    {
        int cur=i;
        for(int j=i+1;j<=n;j++)
            if(val[cur][i]<val[j][i])
                cur=j;
        if(cur!=i) swap(val[i],val[cur]);
        double div=val[i][i];
        for(int j=i;j<=n+1;j++) val[i][j]/=div;
        for(int j=i+1;j<=n;j++)
        {
            div=val[j][i];
            for(int k=i;k<=n+1;k++)
                val[j][k]-=div*val[i][k];
        }
    }
    for(int i=n;i>=1;i--)
    {
        ans[i]=val[i][n+1];
        for(int j=i+1;j<=n;j++)
            ans[i]-=val[i][j]*ans[j];
    }
    for(int i=1;i<=n;i++) printf("%.3lf ",ans[i]);
    return 0;
}

1A真爽我还是太蒻了

[JSOI2008] 球形空间产生器sphere

标签:algo   简单   names   高斯   其他   return   stream   ace   n+1   

原文地址:https://www.cnblogs.com/fengxunling/p/10335488.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!