zoukankan      html  css  js  c++  java
  • bzoj 1337 最小圆覆盖

     1 /**************************************************************
     2     Problem: 1337
     3     User: idy002
     4     Language: C++
     5     Result: Accepted
     6     Time:4 ms
     7     Memory:2372 kb
     8 ****************************************************************/
     9  
    10 #include <cstdio>
    11 #include <cmath>
    12 #include <algorithm>
    13 #define line(a,b) ((b)-(a))
    14 #define eps 1e-10
    15 #define N 100010
    16 using namespace std;
    17  
    18 int sg( double x ) { return (x>-eps)-(x<eps); }
    19 struct Vector {
    20     double x, y;
    21     Vector( double x=0, double y=0 ):x(x),y(y){}
    22     Vector operator+( const Vector &b ) const { return Vector(x+b.x,y+b.y); }
    23     Vector operator-( const Vector &b ) const { return Vector(x-b.x,y-b.y); }
    24     Vector operator*( double b ) const { return Vector(x*b,y*b); }
    25     Vector operator/( double b ) const { return Vector(x/b,y/b); }
    26     double operator^( const Vector &b ) const { return x*b.y-y*b.x; }
    27     double len() { return sqrt(x*x+y*y); }
    28     Vector nor() { return Vector(-y,x); }
    29 };
    30 typedef Vector Point;
    31 Point inter( Point p, Vector u, Point q, Vector v ) {
    32     return p+u*((line(p,q)^v)/(u^v));
    33 }
    34 struct Circle {
    35     Point o;
    36     double r;
    37     Circle(){}
    38     Circle( Point a ):o(a),r(0){}
    39     Circle( Point a, Point b ) {
    40         o = (a+b)/2;
    41         r = (a-b).len()/2;
    42     }
    43     Circle( Point a, Point b, Point c ) {   //  ab^bc != 0
    44         Point p=(a+b)/2, q=(b+c)/2;
    45         Vector u=(a-b).nor(), v=(b-c).nor();
    46         o = inter(p,u,q,v);
    47         r = (o-a).len();
    48     }
    49     bool contain( Point a ) {
    50         return sg( (a-o).len() - r ) <= 0;
    51     }
    52 };
    53  
    54 int n;
    55 Point pts[N];
    56  
    57 int main() {
    58     scanf( "%d", &n );
    59     for( int i=1; i<=n; i++ ) {
    60         double x, y;
    61         scanf( "%lf%lf", &x, &y );
    62         pts[i] = Point(x,y);
    63     }
    64     random_shuffle( pts+1, pts+1+n );
    65     Circle c = Circle(pts[1]);
    66     for( int i=2; i<=n; i++ ) {
    67         if( c.contain(pts[i]) ) continue;
    68         c = Circle(pts[i]);
    69         for( int j=1; j<i; j++ ) {
    70             if( c.contain(pts[j]) ) continue;
    71             c = Circle(pts[i],pts[j]);
    72             for( int k=1; k<j; k++ ) {
    73                 if( c.contain(pts[k]) ) continue;
    74                 c = Circle(pts[i],pts[j],pts[k]);
    75             }
    76         }
    77     }
    78     printf( "%.3lf
    ", c.r );
    79 }
    View Code

    题解见bzoj 1336

  • 相关阅读:
    算法笔记_187:历届试题 网络寻路(Java)
    算法笔记_186:历届试题 高僧斗法(Java)
    算法笔记_185:历届试题 格子刷油漆(Java)
    Tomcat,JBoss与JBoss Web
    JBoss Web和Tomcat的区别
    tomcat与jboss等容器的区别
    dubbo
    ZooKeeper学习第一期---Zookeeper简单介绍
    Java GC系列
    Tomcat中JVM内存溢出及合理配置
  • 原文地址:https://www.cnblogs.com/idy002/p/4549289.html
Copyright © 2011-2022 走看看