题目大意:平面上有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 }
光顾着想用什么新方法比较好了,结果没想到最好的方法。。。