• poj 2079 Triangle,旋转卡壳求点集的最大三角形


    给出一个点集,求顶点在点集中的最大的三角形面积。


    我们知道这三角形的三个点肯定在凸包上,我们求出凸包之后不能枚举,由于题目n比較大,枚举的话要O(n^3)的数量级,所以採用旋转卡壳的做法:
    首先枚举三角形的第一个顶点i, 初始化第二个顶点j=i+1和第三个顶点k=j+1,对k进行循环,直到找到第一个k使得cross(i,j,k)>cross(i,j,k+1),假设k==i进入下一次循环。
    对j,k进行旋转。每次循环之前更新最大值,然后固定一个j,相同找到一个k使得cross(i,j,k)>cross(i,j,k+1)。对j进行++操作,继续进行下一次,知道j==k'(对j,k旋转之前的(k+1)%n)或k==i为止。


    double rotating_calipers(vector<Point>& points){
        vector<Point> p = ConvexHull(points);
        int n = p.size();
        p.push_back(p[0]);
        double ans = 0;
        for(int i=0; i<n; ++i)
        {
            int j = (i+1)%n;
            int k = (j+1)%n;
            //当Area(P[i], p[j], p[k+1]) <= Area(p[i], p[j], p[k]) 时停止旋转
            //即Cross(p[j]-p[i], p[k+1]-p[i]) - Cross(p[j]-p[i], p[k]-p[i]) <= 0
            //依据Cross(A,B) - Cross(A,C) = Cross(A,B-C)
            //化简得Cross(p[j]-p[i], p[k+1] - p[k]) <= 0
            while(k!=i && Cross(p[j]-p[i], p[k+1]-p[k]) > 0)
                k = (k+1) % n;
            if(k==i) continue;
            int kk = (k+1) % n;
            while(j!=kk && k!=i)
            {
                ans = max(ans, Cross(p[j]-p[i], p[k]-p[i]));
                while(k!=i && Cross(p[j]-p[i], p[k+1]-p[k]) > 0)
                    k = (k+1) % n;
                j = (j+1) % n;
            }
        }
        return ans*0.5;
    }


  • 相关阅读:
    poj 2021
    树状数组的修改+查询
    poj 1182
    windows网络模型之重叠IO(完成例程)的使用
    windows网络模型之重叠IO的使用
    python解析HTML之:PyQuery库的介绍与使用
    windows 网络通讯模型Overlapped (转)(未看)
    (转)写的非常好的一篇HTTP协议详解
    (转)Wireshark基本介绍和学习TCP三次握手
    http中COOKIE和SESSION有什么区别?(转知乎)
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7056444.html
Copyright © 2020-2023  润新知