求点集中面积最大的三角形

最大三角形面积 鞋带公式& 海伦公式 给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。 示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这五个点如下图所示。组成的橙色三角形是最大的,面积为2。 注意: 3 <= points.length <= 50. 不存在重复的点。 -50 <= points[i][j] <= 50. 结果误差值在 10^-6 以内都认为是正确答案。 思路:. 阅读详情

如果枚举3个点再算面积,必然超时。

很显然的最大面积的三角形的三个顶点必然是这个点集的凸包上的点,因此先求出凸包。

如果求出凸包仍然枚举,一样会超时。

这个可以借助求凸包直径类似的方法来求最大面积的三角形,使用旋转卡壳方法。

枚举三角形的第一个顶点i,

然后初始第二个顶点j=i+1,第三个顶点k=j+1,

循环k+1直到Area(i,j,k)>Area(i,j,k+1)

更新面积的最大值,下面就开始旋转卡壳了(旋转j,k两个点)

(1)如果Area(i,j,k)

(2)更新面积,j=j+1,如果j=i,跳出循环

这样旋转一圈后,求得的面积就是以i为顶点的最大三角形的面积了。

时间复杂度是O(n^2)

//author:chenkun
//旋转卡壳!
#include <cstdio>
#include <cmath>
 
const int MAXN=50000;
 
struct point {
    int x, y;
} p[MAXN+1],h[MAXN+1];
 
double distance(const point& p1,const point& p2) {
   return sqrt( (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
 
double multiply(const point& sp,const point& ep,const point& op) {
      return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
}
 
int partition(point a[],int p,int r) {
    int i=p,j=r+1,k;
    double ang,dis;
    point R,S;
    k=(p+r)/2;
    R=a[p];
    a[p]=a[k];
    a[k]=R;
    R=a[p];
    dis=distance(R,a[0]);
    while(1) {
        while(1) {
            ++i;
            if(i>r) {
                i=r;
                break;
            }
            ang=multiply(R,a[i],a[0]);
            if(ang>0)
                break;
            else if(ang==0) {
                if(distance(a[i],a[0])>dis)
                break;
            }
        }
        while(1) {
             --j;
            if(j<p) {
                j=p;
                break;
            }
            ang=multiply(R,a[j],a[0]);
            if(ang<0)
                break;
            else if(ang==0) {
                if(distance(a[j],a[0])<dis)
                    break;
            }
        }
        if(i>=j)break;
        S=a[i];
        a[i]=a[j];
        a[j]=S;
    }
    a[p]=a[j];
    a[j]=R;
    return j;
}
 
void anglesort(point a[],int p,int r) {
   if(p<r) {
      int q=partition(a,p,r);
      anglesort(a,p,q-1);
      anglesort(a,q+1,r);
   }
}
 
//对PointSet求凸包,点数为n,凸包上的点保存在ch中,点数位len
void Graham_scan(point PointSet[],point ch[],int n,int &len) {
    int i,k=0,top=2;
    point tmp;
    for(i=1;i<n;i++)
        if ( PointSet[i].x<pointSet[k].x ||
            (PointSet[i].x==PointSet[k].x) && (PointSet[i].y<pointSet[k].y) )
               k=i;
    tmp=PointSet[0];
    PointSet[0]=PointSet[k];
    PointSet[k]=tmp;
    anglesort(PointSet,1,n-1);
    if(n<3) {
        len=n;
        for(int i=0;i<n;i++) ch[i]=PointSet[i];
        return ;
    }
    ch[0]=PointSet[0];
    ch[1]=PointSet[1];
    ch[2]=PointSet[2];
    for (i=3;i<n;i++) {
        while (multiply(PointSet[i],ch[top],ch[top-1])>=0) top--;
            ch[++top]=PointSet[i];
    }
    len=top+1;
}
 
double Area(int i,int j,int k) {
    return multiply(h[j],h[k],h[i])/2;
}
 
inline double max(double a,double b){return a>b?a:b;}
int main() {
    int n;
    while(scanf("%d",&n)!=EOF&&n!=-1) {
        for(int i=0;i<n;i++)
            scanf("%d %d",&p[i].x,&p[i].y);
        int len;
        Graham_scan(p,h,n,len);
        //for(int i=0;i<len;i++)
        //    printf("%d %d\n",h[i].x,h[i].y);
 
        double ans=0;
        for(int i=0;i<len;i++) {
            int j=(i+1)%len;
            int k=(j+1)%len;
            while(k!=i&&Area(i,j,k)<area(i,j,(k+1)%len)) {
                k=(k+1)%len;
            }
            if(k==i) continue;
            int kk=(k+1)%len;
            while(j!=kk&&k!=i) {
                ans=max(ans,Area(i,j,k));
                while(k!=i&&Area(i,j,k)<area(i,j,(k+1)%len)) {
                    k=(k+1)%len;
                }
                j=(j+1)%len;
            }
        }
 
        printf("%.2f\n",ans);
    }
    return 0;
}

 

【枚举】求三角形最大面积问题 3、求三角形最大面积问题(triangle.pas/cpp)   【题目描述】 圣诞节快到了。你接受了一件光荣的任务,就是制作圣诞树顶上的那颗大星星。不过当你拿到制作的三角形银纸的时候,你发现银纸上面有许多洞。原来你的妹妹已经在银纸上剪下了一些小的三角形来制作小星星。你唯有寻找一个算法,告诉你在每张银纸上还能切出来的最大的三角形面积。 给定一个三角形,里面有黑色和白色的区域,你必须找到白色 阅读详情

相关推荐

hdu step 7 1 6 最大三角形 凸包的应用——在n个点中找到3个点 它们所形成的三角形面积最大

hdu step 7 1 6 最大三角形 凸包的应用——在n个点中找到3个点 它们所形成的三角形面积最大

sfhinsc的博客 769

算法——白书中三角形最大周长的快速求法

题目描述 给定一个n,总共有n个长度的小木棍,输出能形成的最大三角形的面积,若无则输出0; 注解说有nlogn的解法,没细想,倒是想到了n的解法 解法 暴力拆解:这个就不用说了,复杂度O(n³),数据大了可能就跪了 先排序,再判断能否组成三角形,复杂度O(n)。 思路 先排序,从最大的数开始判断,判断最大的三个数能否组成三角形,能就是最大的三角形了,若无法形成三角形,接下来的数据和最大的那...

treasure_wang的博客 919

车载以太网SOMEIP入门必看:从服务发现到事件订阅,一次搞懂三种核心通信模式(附报文实例)

本文深入解析车载以太网SOME/IP的三种核心通信模式:服务发现、方法调用和事件订阅,通过真实报文实例和仿真工具演示,帮助开发者快速掌握这一关键技术。文章特别强调服务发现机制的基础作用,并详细介绍了Request/Response与Fire&Forget两种方法调用模式的应用场景,为智能汽车网络通信开发提供实用指南。

weixin_30955617的博客 111

二分 点集中最近点对、周长最小三角形

HDOJ 1007  点集中 最近点对 :又是二分,在一个找中间点时没加判断条件,TIL了好多次,后来找到了这个小错误,AC。 学几何以来感觉到二分很强大。昨天晚上10级ACM选拨,想练练手感用二分查找去试着做N的N次方,但是数据太大,WA了。只好老实用对数方法做了。 HDOJ 3868  点集中 周长最小三角形 :杭电OJ不给力,学了这么久几何,唯一一次有可能在OJ比赛中

隐刀2024的专栏 1029

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 359

STM32寄存器级电机驱动:DRV8833 H桥与PWM调速原理

电机驱动是嵌入式控制系统的核心基础能力,其本质是微控制器通过数字信号精确控制功率器件的开关时序。理解H桥电路结构、反电动势防护机制及PWM调制原理,是实现可靠直流电机控制的前提。DRV8833作为典型双H桥驱动芯片,支持快衰减与慢衰减两种PWM调速模式,分别对应不同的电流泄放路径与动态响应特性。在STM32平台上,需结合时钟树配置、GPIO复用、定时器寄存器(PSC/ARR/CCR)精确计算,将抽象的转速需求转化为可执行的硬件操作。该技术广泛应用于智能小车、机器人关节、工业定位系统等实时运动控制场景,是掌握

weixin_42613017的博客 675

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进入下一次循环

天亮说晚安 2010

安卓光速虚拟机ADB调试实战:从密钥配置到设备连接

本文详细介绍了在安卓光速虚拟机中进行ADB调试的完整实战流程。核心在于通过密钥配置解决设备未授权问题,并启用网络调试与端口映射,最终实现电脑与虚拟机的稳定连接。文章提供了从原理理解、脚本修改到实战命令和疑难排查的全方位指南,帮助开发者和爱好者高效利用光速虚拟机作为移动测试沙盒。

CAT789的专栏 552

poj 2079 求一个平面所有点构成最大三角形的面积

#include #include #include #define eps 1e-8 #define max(x,y) (((x)>(y))?(x):(y)) using namespace std; int n,top; struct point { double x,y; }p[50000+16],stack[10000]; bool equal(double n) { return f

sky_zdk的博客 1719

Kaggle赛题总结:Enefit - Predict Energy Behavior of Prosumers

竞赛旨在解决能源不平衡的问题,即预计使用的能源与实际使用或产生的能源不符。自发自用者是既消耗又产生能源的个体,他们在造成能源不平衡方面起到了重要作用。尽管他们只占所有能源消费者的一小部分,但他们不可预测的能源使用行为给能源公司带来了物流和财务问题。如果不加以解决,可能会导致运营成本增加、电网不稳定以及能源资源的低效利用。如果这个问题得到有效解决,将显著降低不平衡成本,提高电网的可靠性,并使自发自用者更高效和可持续地融入能源系统中。

猫敷雪 741

使用Mask2Former和X-Decoder训练自定义数据集及结果复现报告

本报告记录了使用MMDetection框架中的Mask2Former和X-Decoder模型在自定义数据集上的训练过程。报告包含环境配置、数据集准备、模型训练与优化(解决了Mask2Former的PQ值异常问题)、性能评估等关键环节。详细展示了从数据集转换(将客户提供的COCO格式数据适配MMDetection框架)、配置文件修改、到最终模型训练和评估的全流程。特别针对Mask2Former训练中的PQ值异常问题提供了解决方案,并对比了两种模型在自定义数据集上的表现。报告还包含完整的代码实现和技术细节。

huanghm88的专栏 1087

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3934 题意:给出n个点,从中找出三个点使得面积最大。 思路:旋转卡壳模板题:首先求凸包,在旋转求最大面积。 #include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;cmath&gt; #include &lt;al...

weixin_33758863的博客 218

100天精通Python(可视化篇)——第89天:Bokeh库绘图可视化基础入门(参数说明+案例实战)

专栏导读 一、Bokeh是什么? 二、安装与导入 三、Bokeh接口介绍 四、创建图表 五、添加自定义渲染器 切换主题 添加图例 图例位置 图例方向 图例背景和边界 图例文本的外观 行列布局 网格布局

努力让自己发光,对的人才能迎着光而来 1万+

[leetcode] 812. Largest Triangle Area

Description You have a list of points in the plane. Return the area of the largest triangle that can be formed by any 3 of the points. Example: Input: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] Output: ...

Learning from the mistakes 252

【Leetcode】269.火星词典(Hard)

应用拓扑排序

明朗晨光的专栏 765

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

POJ 2079/HDU 3934 旋转卡壳

题意: 给一些点,任选任选三个构成三角形,求这个三角形的最大面积。 题解:旋转卡壳,水题了。。 n^2明显的过不了的,但是数据水,能过。 有没有nlogn的算法啊?? View Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib>...

weixin_30607029的博客 113

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java实现 LeetCode 812 最大三角形面积 (暴力)

812. 最大三角形面积 给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。 示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这五个点如下图所示。组成的橙色三角形是最大的,面积为2。 注意: 3 <= points.length <= 50. 不存在重复的点。 -50 <= points[i][j] <= 50. 结果误差值在 10^-6 以内都认为是正确答案。 class Solut

南 墙 9351

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

812.最大三角形面积

812. 最大三角形面积 给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。 示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这五个点如下图所示。组成的橙色三角形是最大的,面积为2。 注意: ​ 3 <= points.length <= 50. 不存在重复的点。 -50 <= points[i][j] <= 50. 结果误差值在 10^-6 ...

m0_51149095的博客 2657

Leetcode 最大三角形面积

给定包含多个点的集合,从其中取三个点组成三角形,返回能组成的最大三角形的面积。 示例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这五个点如下图所示。组成的橙色三角形是最大的,面积为2。 注意: 3 <= points.length <= 50. 不存在重复的点。 -50 <= p...

持续学习和分享感兴趣的技术 555

LintCode 1005. 三角形最大面积 JavaScript算法

描述 平面上有一系列点。返回由其中三个点可以形成的三角形最大面积。 说明 3 <= points.length <= 50. 点不会重复。 -50 <= points[i][j] <= 50. 结果误差在10^(-6)以内可以被认为是正确的。 样例 - 样例: 输入: points = [[0,0],[0,1],[1,0],[0,2],[2,0]] 输出: 2 解释: 这五个点如图所示,红色三角形面积最大。 解析 上百度查了下三角形面积怎么计算,结果让人你大吃一惊,数学家门果然都

smallteddy.blog.youkuaiyun.com 2707

关于三角形面积的公式与格点多边形面积计算算法的讨论

已知三角形三点坐标求三角形面积公式 公式: 即S=1/2[(x1y2-x2y1)+(x2y3-x3y2)+(x3y1-x1y3)] 证明过程:此链接 格点三角形求面积或求三角形里格点(整点)个数[皮克定理] 一张方格纸上,上面画着纵横两组平行线,相邻平行线之间的距离都相等,这样两组平行线的交点,就是所谓格点。如果取一个格点做原点O,如图1,取通过这个格点的横向和纵向两直线分别做横坐标

Daioo 随笔 1万+

NYOJ 952 最大四边形 (n个点求组成四边形的最大面积)

最大四边形 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 平面坐标上有n个点,你知道能组成四边形中面积最大的是多少吗? 输入有多组测试数据 第一行整数n,表示有n个点,( 4 然后n行,每行x,y表示点的坐标。(没有重复的点)输出最大四边形的面积.(保留六位小数)样例输入 5 0 0 0 4 4 0 4 4 2 3 样例输出 16.000000

滴水穿石,慢慢积累,总会有成果 1973

多组坐标选出任意三个点构成的最大的三角形的面积(C语言)

【问题描述】 给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大。 我是在问答上看到的这个问题--出构成的最大的三角形的面积,结果保留两位小数。C语言,谢谢 【分析】 主要的过程在于如何求出所有的排列组合情况: 这里需要用到回溯法求解。 其他的就比较好办了 代码: #include &lt;stdio.h&gt; #include &lt...

凌空的桨 3959
上一篇: Linux下C语言用socket获取网页源码…
下一篇: 凸包算法
nuoline
博客等级 码龄18年 345粉丝 247原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值