zoukankan      html  css  js  c++  java
  • 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
    ",c.x,c.y,r);
    87     }
    88      return 0;
    89 }
  • 相关阅读:
    python入门第十七天_生成器 迭代器
    python入门第十六天__列表生成式
    装饰器补充知识点_ @functools.wraps(func)
    函数练习题2
    函数编程练习题1
    迭代器
    生成器的send方法
    函数写生成器
    斐波那契数列
    生成器
  • 原文地址:https://www.cnblogs.com/HugeGun/p/5263434.html
Copyright © 2011-2022 走看看