HDOJ 2215 Maple trees 最小圆覆盖

来源:互联网 发布:不读书 知乎 编辑:程序博客网 时间:2024/04/27 18:31


增量法最小圆覆盖....


Maple trees

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1646    Accepted Submission(s): 510


Problem Description
There are a lot of trees in HDU. Kiki want to surround all the trees with the minimal required length of the rope . As follow, 

To make this problem more simple, consider all the trees are circles in a plate. The diameter of all the trees are the same (the diameter of a tree is 1 unit). Kiki can calculate the minimal length of the rope , because it's so easy for this smart girl.
But we don't have a rope to surround the trees. Instead, we only have some circle rings of different radius. Now I want to know the minimal required radius of the circle ring. And I don't want to ask her this problem, because she is busy preparing for the examination.
As a smart ACMer, can you help me ?
 

Input
The input contains one or more data sets. At first line of each input data set is number of trees in this data set n (1 <= n <= 100), it is followed by n coordinates of the trees. Each coordinate is a pair of integers, and each integer is in [-1000, 1000], it means the position of a tree’s center. Each pair is separated by blank.
Zero at line for number of trees terminates the input for your program.
 

Output
Minimal required radius of the circle ring I have to choose. The precision should be 10^-2.
 

Sample Input
21 0-1 00
 

Sample Output
1.50
 

Author
zjt
 



/* ***********************************************Author        :CKbossCreated Time  :2014年12月29日 星期一 17时19分19秒File Name     :HDOJ2215.cpp************************************************ */#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <string>#include <cmath>#include <cstdlib>#include <vector>#include <queue>#include <set>#include <map>using namespace std;const int maxn = 111;const double eps=1e-8;int dcmp(double x){if(fabs(x)<eps) return 0;return x>eps?1:-1;}struct Point{double x,y;Point(){}Point(double _x,double _y) { x=_x; y=_y;}}pt[maxn];struct Circle{Point c; double r;Circle(){}Circle(Point _c,double _r) { c=_c; r=_r; }};Point operator+(Point A,Point B) { return Point(A.x+B.x,A.y+B.y); }Point operator-(Point A,Point B) { return Point(A.x-B.x,A.y-B.y); }Point operator*(Point A,double p) { return Point(A.x*p,A.y*p); }Point operator/(Point A,double p) { return Point(A.x/p,A.y/p); }double Dot(Point A,Point B) { return A.x*B.x+A.y*B.y; }double Length(Point A) { return sqrt(Dot(A,A)); }double Cross(Point A,Point B) { return A.x*B.y-A.y*B.x; }Circle CircumscribedCircle(Point p1,Point p2,Point p3){double Bx=p2.x-p1.x,By=p2.y-p1.y;double Cx=p3.x-p1.x,Cy=p3.y-p1.y;double D=2*(Bx*Cy-By*Cx);double cx=(Cy*(Bx*Bx+By*By)-By*(Cx*Cx+Cy*Cy))/D+p1.x;double cy=(Bx*(Cx*Cx+Cy*Cy)-Cx*(Bx*Bx+By*By))/D+p1.y;Point p=Point(cx,cy);return Circle(p,Length(p1-p));}void min_cover_circle(Point p[],int n,Circle& c){c.c=p[0]; c.r=0;for(int i=1;i<n;i++){if(dcmp(Length(p[i]-c.c)-c.r)>0){c.c=p[i]; c.r=0;for(int j=0;j<i;j++){if(dcmp(Length(p[j]-c.c)-c.r)>0){c.c=Point((p[i].x+p[j].x)/2.,(p[i].y+p[j].y)/2.);c.r=Length(p[j]-p[i])/2.;for(int k=0;k<j;k++){if(dcmp(Length(p[k]-c.c)-c.r)>0){c=CircumscribedCircle(p[i],p[j],p[k]);}}}}}}}int n;int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);while(scanf("%d",&n)!=EOF&&n){for(int i=0;i<n;i++) scanf("%lf%lf",&pt[i].x,&pt[i].y);Circle c;min_cover_circle(pt,n,c);printf("%.2lf\n",c.r+0.5);}    return 0;}


1 0
原创粉丝点击