zoukankan      html  css  js  c++  java
  • 求一个覆盖所有点的最小圆 最小圆覆盖

    题目大意:平面上有n个点,求绘制一个半径最小的圆,覆盖所有的点  精度0.1  点的坐标最大为 100000

    方法1:http://wenku.baidu.com/view/584b6d3e5727a5e9856a610d.html   O(n)

    方法2:三分套三分暴力求解如下。O(1600 n)时间开销  1600~(log  2/3  0.1/100000) ^2

     1 float disy(float y,float x)
     2 {
     3     int n=pvec.size();
     4     float Rmin=0;
     5     
     6     for(int i=0;i<n;i++)
     7     {
     8         Rmin=max(Rmin,sqrt((pvec[i].y-y)*(pvec[i].y-y)+ (pvec[i].x-x)*(pvec[i].x-x)));
     9     }
    10     return Rmin;
    11 }
    12 float dis(float x)
    13 {
    14     ymax=10000,ymin=0;
    15     while(ymax-ymin>accu)
    16     {
    17         if(disy(ymin+(ymax-ymin)*2.0/3,x)<disy(ymin+(ymax-ymin)*1.0/3,x))
    18         {
    19             ymin=ymin+(ymax-ymin)*1.0/3;
    20         }
    21         else
    22             ymax=ymin+(ymax-ymin)*2.0/3;
    23     }
    24     return disy((ymax+ymin)/2,x);
    25 }
    26 int findcenter(POINT &pstart)
    27 {
    28     xmax=0,xmin=10000;
    29     int n=pvec.size();    
    30     for(int i=0;i<n;i++)
    31     {
    32         xmax=max(xmax,pvec[i].x);
    33         xmin=min(xmin,pvec[i].x);
    34     }
    35     while((xmax-xmin)/2>accu)
    36     {
    37         if(dis(xmin+(xmax-xmin)*1.0/3)<dis(xmin+(xmax-xmin)*2.0/3))
    38         {
    39             xmax=xmin+(xmax-xmin)*2.0/3;
    40         }
    41         else
    42             xmin=xmin+(xmax-xmin)*1.0/3;
    43     }
    44     pstart.x=(xmax+xmin)/2;
    45     pstart.y=(ymax+ymin)/2;
    46     int r=disy((ymax+ymin)/2,(xmax+xmin)/2);
    47     return r;
    48 }

    光顾着想用什么新方法比较好了,结果没想到最好的方法。。。

  • 相关阅读:
    python 将字符串作为脚本运行
    Django Model获取字段名称并转为List存储
    django 过滤查询
    django 视图中异步执行python脚本
    python 异步执行python脚本
    django 筛选不等于的内容
    phpstorm中快速添加函数注释
    搜索模板elasticsearch
    laravel模型关联
    laravel关联用户
  • 原文地址:https://www.cnblogs.com/tjsudys/p/4464481.html
Copyright © 2011-2022 走看看