zoukankan      html  css  js  c++  java
  • Bzoj1013--Jsoi2008球形空间产生器

    竟然会想去用随机艹这道题。。。太年轻

    实际上两个点与坐标列一个方程,高斯消元解这n个方程组就好了。

    讲道理随机也可以过的吧?

    主要是不好找一个单调的状态来退火或者爬山

    因为超出圆范围外无限远处到所有点距离也相等,但并不是圆心。

    大概可以先用到所有点距离和来爬一下山,最终点就肯定在圆里,在小步小步的爬山,强制使自己陷入这个局部最优解。

    也许可行?

    高斯代码:

    #include<bits/stdc++.h>
    #define MAXN 12
    #define INF 100000000
    #define eps 1e-9
    using namespace std;
    
    int n;
    double x[MAXN][MAXN],gs[MAXN][MAXN];
    
    inline double _pow(double a) {return a*a;};
    inline double _abs(double a) {return a>0?a:-a;}
    
    int main() {
        scanf("%d",&n);n++;
        for(int i=1;i<=n;i++) for(int j=1;j<n;j++) scanf("%lf",&x[i][j]);
        for(int i=1;i<n;i++) for(int j=1;j<n;j++) gs[i][0]+=_pow(x[i][j])-_pow(x[i+1][j]);
        for(int i=1;i<n;i++) for(int j=1;j<n;j++) gs[i][j]=2*(x[i][j]-x[i+1][j]);
        for(int pos,i=1;i<n;i++) {
            for(int j=i;j<n;j++) if(_abs(gs[j][i])>eps) {pos=j;break;}
            swap(gs[pos],gs[i]);
            for(int j=1;j<n;j++) if(_abs(gs[j][i])>eps&&j!=i) {
                double p=(-gs[j][i])/gs[i][i];
                for(int k=0;k<n;k++) gs[j][k]+=gs[i][k]*p;
            }
        }
        printf("%.3lf",gs[1][0]/gs[1][1]);
        for(int i=2;i<n;i++) printf(" %.3lf",gs[i][0]/gs[i][i]);
        printf("
    ");
        return 0;
    }
  • 相关阅读:
    Java进阶知识查漏补缺05
    Java进阶知识查漏补缺04
    Java进阶知识查漏补缺03
    Java进阶知识查漏补缺02
    Java进阶知识查漏补缺01
    在IDEA下导入项目后,WEB网页只显示jsp源码的解决方法
    Tutorial 3_工厂方法模式
    Tutorial 2_简单工厂模式
    Tutorial 1_UML与面向对象程序设计基本原则
    Java知识查漏补缺-04
  • 原文地址:https://www.cnblogs.com/ihopenot/p/5922712.html
Copyright © 2011-2022 走看看