hud3007 Buried memory

题目链接

最小圆覆盖

并不知道为什么是O(n)的,而且要随机化点的顺序

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<string>
 7 #include<cmath>
 8 #include<ctime>
 9 #include<queue>
10 #include<stack>
11 #include<map>
12 #include<set>
13 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
14 #define re(i,l,r) for(int i=(l);i<=(r);i++)
15 #define Clear(a,b) memset(a,b,sizeof(a))
16 #define inout(x) printf("%d",(x))
17 #define douin(x) scanf("%lf",&x)
18 #define strin(x) scanf("%s",(x))
19 #define LLin(x) scanf("%lld",&x)
20 #define op operator
21 #define CSC main
22 typedef unsigned long long ULL;
23 typedef const int cint;
24 typedef long long LL;
25 using namespace std;
26 const double eps=1e-8;
27 double f(const long double &a){return a*a;}
28 void inin(int &ret)
29 {
30     ret=0;int f=0;char ch=getchar();
31     while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
32     while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar();
33     ret=f?-ret:ret;
34 }
35 struct xl
36 {
37     double x,y;
38     xl(double x=0.,double y=0.):x(x),y(y){}
39     xl op + (const xl &rhs){return xl(x+rhs.x,y+rhs.y);}
40     xl op / (const double &rhs){return xl(x/rhs,y/rhs);}
41     void in(){douin(x),douin(y);}
42 };
43 double dis(const xl &a,const xl &b)
44 {
45     return sqrt(f(a.x-b.x)+f(a.y-b.y));
46 }
47 xl di[555];
48 int n;
49 xl outoftriangle(const xl &A,const xl &B,const xl &C)
50 {
51     double bx=B.x-A.x,by=B.y-A.y;
52     double cx=C.x-A.x,cy=C.y-A.y;
53     double area=2*(bx*cy-by*cx);
54     double x=(cy*(f(bx)+f(by))-by*(f(cx)+f(cy)))/area+A.x;
55     double y=(bx*(f(cx)+f(cy))-cx*(f(bx)+f(by)))/area+A.y;
56     return xl(x,y);
57 }
58 xl solve(double &r)
59 {
60     xl ret;
61     random_shuffle(di+1,di+n+1);
62     ret=di[1];r=0.;
63     re(i,2,n)if(dis(di[i],ret)>r+eps)
64     {
65         ret=di[i],r=0.;
66         re(j,1,i-1)if(dis(di[j],ret)>r+eps)
67         {
68             ret=(di[i]+di[j])/2.;
69             r=dis(di[j],ret);
70             re(k,1,j-1)if(dis(di[k],ret)>r+eps)
71             {
72                 ret=outoftriangle(di[i],di[j],di[k]);
73                 r=dis(di[i],ret);
74             }
75         }
76     }
77     return ret;
78 }
79 int main()
80 {
81     while(scanf("%d",&n)&&n)
82     {
83         re(i,1,n)di[i].in();
84         double r;
85         xl c=solve(r);
86         printf("%.2f %.2f %.2f\n",c.x,c.y,r);
87     }
88      return 0;
89 }

 

posted @ 2016-03-10 20:57  HugeGun  阅读(247)  评论(0编辑  收藏  举报