zoukankan      html  css  js  c++  java
  • [JSOI2008]球形空间产生器(高斯消元)

    将整个空间问题作个转化

    草稿纸上列一下主要的几个式子

    可以看出x^2的项都可以抵消,然后系数就显而易见了,

    作好预处理后直接高斯消元做一遍即可

    给一下题面

    #include<bits/stdc++.h>
    using namespace std;
    const int N=101;
    double a[N][N];
    int m,n;
    struct node
    {
        double x[12];
    } pt[N];
    double sqr(double x) {return x*x;}
    void prepare()
    {
        for (int i=2;i<=n+1;i++)
        {
            for (int j=1;j<=n;j++)
            {
                double xs=pt[i].x[j]-pt[i-1].x[j];
                a[i-1][j]=2*xs;
            }
            double sum=0;
            for (int j=1;j<=n;j++)
            {
                sum+=sqr(pt[i].x[j]);
                sum-=sqr(pt[i-1].x[j]);
            }
            a[i-1][n+1]=sum;
        }
    }
    void solve()
    {
        for (int i=1;i<=n;i++)
        {
            int mx=i;
            for (int j=i+1;j<=n;j++)
            if (fabs(a[j][i])>fabs(a[mx][i])) mx=j;
            for (int j=1;j<=n+1;j++) swap(a[i][j],a[mx][j]);
            for (int j=1;j<=n;j++)
            if (j!=i)
            {
                double temp=a[j][i]/a[i][i];
                for (int k=i+1;k<=n+1;k++)
                a[j][k]-=a[i][k]*temp;
            }
        }
    }
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n+1;i++)
         for (int j=1;j<=n;j++) 
         scanf("%lf",&pt[i].x[j]);
        prepare();
        solve();
        for (int i=1;i<=n;i++)
        printf("%.3lf ",a[i][n+1]/a[i][i]);
        return 0;
    }
    慢即是快,细则是能,于小处铸迤逦
  • 相关阅读:
    idea连接数据库和版本控制(Version Control)
    Idea新手入门-部署tomcat
    Redis 列表(List)
    Redis 集合(Set)
    Redis中的哈希(Hash)
    Redis初步整理
    C#中的集合之ArryList
    linux中pip安装步骤与使用详解
    搭建 LAMP 环境
    搭建WordPress 个人博客
  • 原文地址:https://www.cnblogs.com/Hale522520/p/10622674.html
Copyright © 2011-2022 走看看