zoukankan      html  css  js  c++  java
  • bzoj 1069

    最开始想到的是枚举3个点,另一个点用卡壳的思想,但实际上可以只枚举两个点(对角线上的两个点),其余两个点用卡壳。

    /**************************************************************
        Problem: 1069
        User: idy002
        Language: C++
        Result: Accepted
        Time:232 ms
        Memory:880 kb
    ****************************************************************/
     
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #define min(a,b) ((a)<(b)?(a):(b))
    #define max(a,b) ((a)>(b)?(a):(b))
    #define eps 1e-10
    #define N 2010
    using namespace std;
     
    int sg( double x ) { return (x>-eps)-(x<eps); }
    struct Vector {
        double x, y;
        Vector(){}
        Vector( double x, double y ):x(x),y(y){}
        Vector operator+( const Vector & b ) const { return Vector(x+b.x,y+b.y); }
        Vector operator-( const Vector & b ) const { return Vector(x-b.x,y-b.y); }
        Vector operator*( double b ) const { return Vector(x*b,y*b); }
        Vector operator/( double b ) const { return Vector(x/b,y/b); }
        double operator^( const Vector & b ) const { return x*b.y-y*b.x; }
        double operator&( const Vector & b ) const { return x*b.x+y*b.x; }
        bool operator<( const Vector & b ) const {
            return x<b.x || (x-b.x<eps && y<b.y);
        }
    };
    typedef Vector Point;
     
    bool onleft( Point &A, Point &B, Point &P ) {
        return sg((B-A)^(P-A)) > 0;
    }
    int convex( int n, Point *p, Point *c ) {
        int m;
        sort( p, p+n );
        c[m=0] = p[0];
        for( int i=1; i<n; i++ ) {
            while( m>0 && !onleft(c[m-1],c[m],p[i]) ) m--;
            c[++m] = p[i];
        }
        int k=m;
        for( int i=n-2; i>=0; i-- ) {
            while( m>k && !onleft(c[m-1],c[m],p[i]) ) m--;
            c[++m] = p[i];
        }
        return m+(n==1);
    }
    double area( Point &A, Point &B, Point &P ) {
        return (B-A)^(P-A);
    }
    double maxarea( int n, Point *p ) {
        if( n<=2 ) return 0.0;
        if( n==3 ) return fabs(area(p[0],p[1],p[2]));
     
        static int nxt[N];
        nxt[n-1]=0;
        for( int i=0; i<n-1; i++ ) nxt[i]=i+1;
         
        double rt = 0.0;
        for( int i=0; i<n; i++ ) {
            for( int j=nxt[nxt[i]],a=nxt[i],b=nxt[j]; nxt[j]!=i; j=nxt[j] ) {
                while( area(p[i],p[a],p[j])<area(p[i],p[nxt[a]],p[j]) ) a=nxt[a];
                while( area(p[j],p[b],p[i])<area(p[j],p[nxt[b]],p[i]) ) b=nxt[b];
                double ra = area(p[i],p[a],p[j]);
                double rb = area(p[j],p[b],p[i]);
                rt = max( rt, ra+rb );
            }
        }
        return rt/2.0;
    }
     
    int n, cn;
    Point pts[N], cvx[N];
     
    int main() {
        scanf( "%d", &n );
        for( int i=0; i<n; i++ ) 
            scanf( "%lf%lf", &pts[i].x, &pts[i].y );
        cn = convex( n, pts, cvx );
        printf( "%.3lf
    ", maxarea(cn,cvx) );
    }
    View Code
  • 相关阅读:
    static final常量变量的正确书写规范
    Why aren't more desktop apps written with Qt?(quora.com系列文章)
    建议学个一知半解的时候,再看书
    C++中new和delete的背后(最后还是调用了MSVCR90的malloc)
    关于Qt的事件循环以及QEventLoop的简单使用(QEventLoop::quit()能够终止事件循环,事件循环是可以嵌套的)
    QProcess::startDetached(5.10有了一种新的方式)
    微信公众号支付开发
    Middleware

    TOKEN+签名验证
  • 原文地址:https://www.cnblogs.com/idy002/p/4418095.html
Copyright © 2011-2022 走看看