• hdu 3934 Summer holiday(凸包最大内接三角形)


    求n个点能组成的最大三角形,一发旋转卡壳模板题。。。

        #include<algorithm>
        #include<iostream>
        #include<cstring>
        #include<cstdlib>
        #include<fstream>
        #include<sstream>
        #include<vector>
        #include<string>
        #include<cstdio>
        #include<bitset>
        #include<stack>
        #include<queue>
        #include<cmath>
        #include<map>
        #include<set>
        #define FF(i, a, b) for(int i=a; i<b; i++)
        #define FD(i, a, b) for(int i=a; i>=b; i--)
        #define REP(i, n) for(int i=0; i<n; i++)
        #define CLR(a, b) memset(a, b, sizeof(a))
        #define PB push_back
        #define LL long long
        #define eps 1e-10
        #define debug puts("**debug**")
        using namespace std;
    
        struct Point
        {
            double x, y;
            Point(double x=0, double y=0) : x(x), y(y) {}
        };
        typedef Point Vector;
    
        Vector operator + (Vector a, Vector b) { return Vector(a.x+b.x, a.y+b.y) ; }
        Vector operator - (Point a, Point b)   { return Vector(a.x-b.x, a.y-b.y); }
        Vector operator * (Vector a, double p) { return Vector(a.x*p, a.y*p); }
        Vector operator / (Vector a, double p) { return Vector(a.x/p, a.y/p); }
    
        bool operator < (const Point& a, const Point& b)
        {
            return a.x < b.x || (a.x == b.x && a.y < b.y);
        }
    
        int dcmp(double x)
        {
            if(fabs(x) < eps) return 0; return x < 0 ? -1 : 1;
        }
        bool operator == (const Point& a, const Point& b)
        {
            return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;
        }
        double Cross(Vector a, Vector b) { return a.x*b.y - a.y*b.x; }
        double Dot(Vector a, Vector b) { return a.x*b.x + a.y*b.y ;}
        double Length(Vector a) { return sqrt(Dot(a, a)); }
    
        int ConvexHull(Point* p, int n, Point* ch)
        {
            sort(p, p+n);
            int m = 0;
            REP(i, n)
            {
                while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <=0) m--;
                ch[m++] = p[i];
            }
            int k = m;
            FD(i, n-2, 0)
            {
                while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
                ch[m++] = p[i];
            }
            if(n > 1) m--;
            return m;
        }
    
        double RC_Distance(Point* ch, int n)  //凸包直径
        {
            int q = 1;
            double ans = 0;
            ch[n] = ch[0];
            REP(p, n)
            {
                while(Cross(ch[q+1]-ch[p+1], ch[p]-ch[p+1]) > Cross(ch[q]-ch[p+1], ch[p]-ch[p+1])) q = (q+1)%n;
                ans = max(ans, max(Length(ch[p]-ch[q]), Length(ch[p+1]-ch[q+1])));
            }
            return ans;
        }
    
        double RC_Triangle(Point* res,int n)// 凸包最大内接三角形
        {
             if(n<3)    return 0;
             double ans=0, tmp;
             res[n] = res[0];
             int j, k;
             REP(i, n)
             {
                 j = (i+1)%n;
                 k = (j+1)%n;
                 while((j != k) && (k != i))
                 {
                      while(Cross(res[j] - res[i], res[k+1] - res[i]) > Cross(res[j] - res[i], res[k] - res[i])) k= (k+1)%n;
                      tmp = Cross(res[j] - res[i], res[k] - res[i]);if(tmp > ans) ans = tmp;
                      j = (j+1)%n;
                 }
             }
             return ans;
        }
    
        Point read_point()
        {
            Point a;
            scanf("%lf%lf", &a.x, &a.y);
            return a;
        }
    
        const int maxn = 1000010;
        int n;
        double x, y, w;
        Point p[maxn], ch[maxn];
    
        int main()
        {
            while(~scanf("%d", &n))
            {
                REP(i, n) p[i] = read_point();
                int m = ConvexHull(p, n, ch);
                double ans = RC_Triangle(ch, m);
                printf("%.2f
    ", ans/2);
            }
            return 0;
        }
    


  • 相关阅读:
    Android Studio使用笔记
    Android Material Design之在RecyclerView中嵌套CardView实现
    RR 和RC 幻读问题
    mysql rr和rc区别
    7.2 Database Backup Methods 数据备份方法:
    7.1 Backup and Recovery Types 备份和恢复类型
    Chapter 7 Backup and Recovery 备份和恢复:
    mysqldump 一些参数体验
    (?m) 可以让.去匹配换行
    perl 正则前导字符
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3285811.html
Copyright © 2020-2023  润新知