• bzoj2823: [AHOI2012]信号塔


    传送门

    一个最小圆覆盖的模板。

    之前一直没懂三点求圆心的那段代码,orz汪神

    //Achen
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<vector>
    #include<cstdio>
    #include<queue>
    #include<cmath>
    #define eps 1e-6
    const int N=1000007; 
    #define For(i,a,b) for(int i=(a);i<=(b);i++)
    #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
    typedef long long LL;
    typedef double db;
    using namespace std;
    int n;
    db r;
    
    template<typename T>void read(T &x)  {
        char ch=getchar(); x=0; T f=1;
        while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
        if(ch=='-') f=-1,ch=getchar();
        for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
    }
    
    struct pt {
        db x,y;
        pt(){}
        pt(db x,db y):x(x),y(y){}
    }p[N],C;
    
    pt operator + (const pt&A,const pt&B) { return pt(A.x+B.x,A.y+B.y); }
    pt operator - (const pt&A,const pt&B) { return pt(A.x-B.x,A.y-B.y); }
    pt operator * (const pt&A,const db&B) { return pt(A.x*B,A.y*B); }
    pt operator / (const pt&A,const db&B) { return pt(A.x/B,A.y/B); }
    db dot(const pt&A,const pt&B) { return A.x*B.x+A.y*B.y; }
    db cross(const pt&A,const pt&B) { return A.x*B.y-A.y*B.x; }
    db length(pt A) { return dot(A,A); }
    int dcmp(db a) { return fabs(a)<=eps?0:(a>0?1:-1); }
    bool operator < (const pt &A,const pt&B) { return dcmp(A.x-B.x)<0||(dcmp(A.x-B.x)==0&&dcmp(A.y-B.y)<0);}
    
    pt get_circle_center(pt A,pt B,pt C) {
        pt rs;
        db a1=B.x-A.x,a2=C.x-A.x;
        db b1=B.y-A.y,b2=C.y-A.y;
        db c1=(a1*a1+b1*b1)/2.0;
        db c2=(a2*a2+b2*b2)/2.0;
        db d=a1*b2-a2*b1;
        rs.x=A.x+(c1*b2-c2*b1)/d;
        rs.y=A.y+(c2*a1-c1*a2)/d;
        return rs;
    }
    
    void min_circle_cover(int n,pt p[],pt &c,db &r) {
        random_shuffle(p+1,p+n+1);
        c=p[1]; r=0;
        For(i,2,n) if(dcmp(length(p[i]-c)-r)>0) {
            c=p[i];
            r=0;
            For(j,1,i-1) if(dcmp(length(p[j]-c)-r)>0){
                c=(p[i]+p[j])/2;
                r=length(p[i]-c);
                For(k,1,j-1) if(dcmp(length(p[k]-c)-r)>0){
                    c=get_circle_center(p[i],p[j],p[k]);
                    r=length(p[i]-c);
                }
            }
        }
    }
    
    int main() {
        srand(998244353);
        read(n);
        For(i,1,n) scanf("%lf%lf",&p[i].x,&p[i].y);
        min_circle_cover(n,p,C,r);
        printf("%.2lf %.2lf %.2lf
    ",C.x,C.y,sqrt(r));
        return 0;
    }
    /*
    5 
    1.200 1.200 
    2.400 2.400 
    3.800 4.500 
    2.500 3.100 
    3.900 1.300 
    */
    View Code

     

  • 相关阅读:
    django 在保存数据前进行数据校验
    itertools
    python 发送请求
    python 异常处理
    python 对redis 键值对的操作
    python 对redis key的基本操作
    python 操作redis数据
    一只青蛙一次可以跳1阶或者2阶,n阶,有多少种到达终点的方式。
    Django 自定义扩展命令
    关于函数可变参数
  • 原文地址:https://www.cnblogs.com/Achenchen/p/8636686.html
Copyright © 2020-2023  润新知