题目大意:平面上有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 }

 

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

 

posted on 2015-04-29 00:17  海暗  阅读(3757)  评论(0编辑  收藏  举报