bzoj 1013 高斯消元

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

tags:给出了n+1个点,所有点到球心距离相等。以第一个点列出式子,令其余n个点等于它,就可列出n个n元一次方程组。然后高斯消元即可。

#include<bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/STACK:102400000,102400000")
#define rep(i,a,b) for (int i=a;i<=b;i++)
#define per(i,b,a) for (int i=b;i>=a;i--)
#define mes(a,b)  memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
typedef long long ll;
const int N = 2e5+10;

int n;
double a[15][15], a0[15];
void guass()
{
    rep(i,1,n) {
        double maxn=-1.0;  int mi;
        rep(j,1,n) if(fabs(a[j][i])>maxn)
            maxn=fabs(a[j][i]), mi=j;
        if(mi!=i) rep(j,1,n+1) swap(a[mi][j], a[i][j]);
        rep(j,i+1,n+1) a[i][j]/=a[i][i];
        rep(j,1,n) if(i!=j) {
            double t=a[j][i];
            rep(k,1,n+1) a[j][k]-=t*a[i][k];
        }
    }
}
int main()
{
    scanf("%d", &n);
    rep(i,1,n) scanf("%lf", &a0[i]);
    rep(i,1,n) rep(j,1,n) {
        double x;
        scanf("%lf", &x);
        a[i][j]=2*(x-a0[j]);
        a[i][n+1]+=(x*x)-(a0[j]*a0[j]);
    }
    guass();
    rep(i,1,n-1) printf("%.3f ", a[i][n+1]);
    printf("%.3f\n", a[n][n+1]);

    return 0;
}
posted @ 2017-03-02 00:47  v9fly  阅读(130)  评论(0编辑  收藏  举报