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 }

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

  • 相关阅读:
    Pascal's Triangle II
    Pascal's Triangle
    Best Time to Buy and Sell Stock II
    Best Time to Buy and Sell Stock
    Populating Next Right Pointers in Each Node
    path sum II
    Path Sum
    [转载]小波时频图
    [转载]小波时频图
    [转载]Hilbert变换及谱分析
  • 原文地址:https://www.cnblogs.com/tjsudys/p/4464481.html
Copyright © 2011-2022 走看看