zoukankan      html  css  js  c++  java
  • 2018 ICPC Nanjing D. Country Meow ,最小球覆盖,模拟退火

    2018 ICPC Nanjing D. Country Meow ,最小球覆盖,模拟退火

    题意

    给定(N) 个点,求一个点使得到这(N)个点中最大距离最小,求出这个距离

    [1leq N leq 100,-100000leq x_i,y_i,z_i leq 100000 ]

    分析

    容易想到这是一个最小球覆盖问题,这个问题和最小圆覆盖都可以用模拟退化解决。

    每次贪心地靠近最远距离即可。

    注意这里更新坐标与之前的模拟退化有点不太一样

    代码

    struct Point {
        double x, y, z;
    };
    
    Point p[105];
    
    double get_dis(Point a, Point b) {
        return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z));
    }
    
    const double beginT = 10000, endT = 1e-12, delT = 0.99;
    int n;
    double ans;
    
    void SA(int times) {
        Point pp;
        pp.x = pp.y = pp.z = 0;
        int s = 0 ;
        ans = 1e18;
        while (times--) {
            for (double T = beginT; T >= endT; T *= delT) {
                for (int i = 1; i <= n; i++)
                    if (get_dis(pp, p[i]) > get_dis(pp, p[s])) s = i;
             
                double d = get_dis(p[s], pp);
                ans = min(ans, d);
                pp.x += (p[s].x - pp.x) * T / beginT;
                pp.y += (p[s].y - pp.y) * T / beginT;
                pp.z += (p[s].z - pp.z) * T / beginT;
            }
        }
    }
    
    int main() {
        n = readint();
        for (int i = 1; i <= n; i++) scanf("%lf%lf%lf", &p[i].x, &p[i].y, &p[i].z);
        SA(10);
        printf("%.8f", ans);
    }
    
  • 相关阅读:
    深入探讨this指针
    杂谈:你选择coco 还是unity3d?
    一分钟制作U盘版BT3
    【转载】ShowWindow函数
    hadoop备记
    OA系统权限管理设计(转载)
    二叉树的存储与遍历
    这难道是CSDN的BUG? 大家帮忙看看哪里有问题
    Cookie 操作工具类
    Java实现 蓝桥杯VIP 算法训练 数的统计
  • 原文地址:https://www.cnblogs.com/hznumqf/p/13624213.html
Copyright © 2011-2022 走看看