HDU 2202 最大三角形 (凸包)
Description
老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大。
Eddy对这道题目百思不得其解,想不通用什么方法来解决,因此他找到了聪明的你,请你帮他解决这个题目。
Input
输入数据包含多组测试用例,每个测试用例的第一行包含一个整数n,表示一共有n个互不相同的点,接下来的n行每行包含2个整数xi,yi,表示平面上第i个点的x与y坐标。你可以认为:3 <= n <= 50000 而且 -10000 <= xi, yi <= 10000.
Output
对于每一组测试数据,请输出构成的最大的三角形的面积,结果保留两位小数。
每组输出占一行。
Sample Input
3
3 4
2 6
3 7
6
2 6
3 9
2 0
8 0
6 6
7 7
Sample Output
1.50
27.00
数据量过大如果直接暴力枚举三个点面积取最大会超时
因为最大三角形的顶点一定在凸包上,所以可以用graham扫描线求凸包缩小数据量再枚举
graham扫描线法
- 取得最左下的点的下标,并把其与第一个位置的点交换
- 以第一个点为原点水平线为x轴,进行极角排序(或者说与原点连线的斜率排序)
- graham扫描线(栈的思想 不过下面的代码用的是数组)
- 第一个点和第二个点肯定在凸包上
- 对后续点进行遍历(设为点 x)
- 取栈顶两个点连线 l
- 如果 x在l的右边则把栈顶元素出栈(while循环)
- x入栈
最后得到的栈中的点集就是凸包的点集
极点排序(叉积)
三个点构成的三角形面积
叉积是两个向量所构成的平行四边形的有向面积
因为可能会有多次出栈操作,所以用while循环
P3 -> P4 -> P5 -> P6 -> P5出栈 -> P4出栈
代码
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<math.h>
#include<stack>
#include<vector>
#include<stdio.h>
#define ll long long
#define inf 0x3f3f3f3f
#define pi 3.1415926535
using namespace std;
struct node
{double x,y;
};
node w[50005],v[50005];
int n,t;
bool cmp(node a,node b)//极角排序(叉积)
{if((a.x-w[0].x)*(b.y-w[0].y)-(a.y-w[0].y)*(b.x-w[0].x)==0)return a.x<b.x;return (a.x-w[0].x)*(b.y-w[0].y)-(a.y-w[0].y)*(b.x-w[0].x)>0;
}
double cj(node a,node b,node c)//叉积 A=a-c B=b-c(A和B呈右手系返回值>0左手系<0共线=0)
{return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);
}
void graham()//graham扫描线求凸包
{t=1;v[0]=w[0],v[1]=w[1];for(int i=2; i<n; ++i){while(t>1&&cj(w[i],v[t],v[t-1])>=0)--t;v[++t]=w[i];}
}
int main()
{//freopen("text.txt","r",stdin);while(~scanf("%d",&n)){t=0;for(int i=0; i<n; ++i){scanf("%lf %lf",&w[i].x,&w[i].y);if(w[i].y<w[t].y||(w[i].y==w[t].y&&w[i].x<w[t].x))t=i;}swap(w[0],w[t]);//将最左下角的点放在第一个位置sort(w+1,w+n,cmp);//以第一个点为原点对面的点进行极角排序graham();double ans=0;for(int i=0; i<=t; ++i)for(int j=i+1; j<=t; ++j)//从0开始枚举会与前面的有重复for(int k=j+1; k<=t; ++k)if(ans<fabs(cj(v[i],v[j],v[k])))ans=fabs(cj(v[i],v[j],v[k]));if(t>=2)printf("%.2f\n",ans/2);}
}
HDU 2202 最大三角形 (凸包)相关推荐
- HDU 2202 最大三角形
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- HDU 2202 计算几何
最大三角形 Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- 2202.最大三角形 --计算几何
参考https://www.cnblogs.com/xiexinxinlove/p/3708147.html https://blog.csdn.net/MyHeaven7/article/detai ...
- HDU 1348 Wall ( 凸包周长 )
链接:传送门 题意:给出二维坐标轴上 n 个点,这 n 个点构成了一个城堡,国王想建一堵墙,城墙与城堡之间的距离总不小于一个数 L ,求城墙的最小长度,答案四舍五入 思路:城墙与城堡直线长度是相等的, ...
- HDU - 2091 空心三角形 水题,但是有点坑...
空心三角形 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- poj 1264 hdu 1616 SCUD Busters 凸包+面积计算
http://poj.org/problem?id=1264 这题很看郁闷,看了很久才明白是什么意思.大致就是有数个国家,每个国家有数个房子,房子相互连接组成的最小周长的多边形为该国家领土,当输入-1 ...
- ACM比赛经验、刷题记录及模板库总结(更新中)
前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...
- 张一鸣演讲全文:外部波澜起伏,内心平静如常|字节跳动9周年
世界在动态变化,外部波澜起伏,内心要保持平静如常. 3月30日,在公司9周年庆上,字节跳动创始人张一鸣发表了演讲<平常心做非常事>,分享了他对于"平常心"的思考:如何以 ...
- matlab实现泰森多边形
前言 原文: <泰森多边形(Voronoi图)的matlab绘制>. 本文已经过原作者授权.如有错误,请批评指正. 泰森多边形介绍 泰森多边形是对空间平面的一种剖分,其特点是多边形内的任何 ...
最新文章
- JDBC学习DayTwo
- 凸透镜成像实验软件_中考物理凸透镜成像难点解析
- Windows下删除Kafka中某个Group
- Java基础之this关键字的作用
- Java必刷100题
- flask第一章:项目环境搭建
- GTK+ 2.4 or later isn't available
- 2014年英语一阅读理解Text1
- android学习笔记---51_编码实现软件界面,把固定不变的界面写到xml中,逻辑改变的写到程序中,
- 微信表情暂停使用,漂流瓶功能彻底再见!
- 1.3、TetGen网格化过程之描述
- 短视频图像处理 OpenGL ES 实践
- [iOS]在tableview中用动画效果改变cell的高度
- 简仿Path的商店表情弹出模块
- 企业财务制度二--会计科目名称和编号(一)1291 分期收款发出商品(转载)
- Asp.Net MVC4.0 官方教程 入门指南之八--为Movie模型和库表添加字段
- 资源小屋(更新ing.......)
- 成都榆熙:拼多多商家都想要提高客单价,但是怎么去提高呢?
- python爬虫分析豆瓣中最新电影的影评
- DNA甲基化测序方法介绍
热门文章
- 考虑多风场出力相关性的可再生能源场景生成/风电场景生成,并通过聚类算法场景削减成几个场景,每个场景都有确定的出现概率
- 利用winrar实现自动打包备份的功能!
- MySQL高级---1-黑马
- php在线客服框架,智能在线客服-框架
- 【无标题】Unity之虚拟相机(轨道相机与镜头跟随
- Android 正 N 边形圆角头像的实现
- Linux(ubuntu16.04)FTP服务器搭建详细步骤
- 手把手教你设计CPU-RISC-V处理器读书笔记1:流水线
- 漫天樱花表白小程序:“樱花将灿,冬尽风暖“一樱花和你我都想念~(内含多份源码)
- PMP考试报名条件是什么?