博客
关于我
凸包模板
阅读量:326 次
发布时间:2019-03-03

本文共 1202 字,大约阅读时间需要 4 分钟。

题意

在一个平面坐标系上有n个点,用笔画一个多边形,使得多边形包含这n个点(点在多边形的边上也算包含)。

题解

凸包模板啦。。

感觉先弄了半平面交再弄这个有点怪。。
那是因为这个之前就会了。。
现在只是来存放一下模板而已
教程大概就是先随便找一个一定在凸包上的点,我找的是最左下的一个,然后以他为基准,按逆时针或者顺时针排序(我喜欢为逆时针)
然后判断一下这个新点和栈的第二个元素连起来是不是完美包含第一个元素,是的话就把第一个元素踢掉
容易知道这样是 O(n) O ( n )
CODE:

#include
#include
#include
#include
#include
using namespace std;const int N=1005;const double eps=1e-8;int n;struct pnt{ double x,y;}s[N];double mul (pnt x,pnt y,pnt z){ double x1=x.x-z.x,y1=x.y-z.y; double x2=y.x-z.x,y2=y.y-z.y; return x1*y2-x2*y1;}double dis (pnt x,pnt y){ return sqrt((y.x-x.x)*(y.x-x.x)+(y.y-x.y)*(y.y-x.y));}bool cmp (pnt x,pnt y){ if (abs(mul(x,y,s[1]))
eps;}int sta[N],top;int main(){ scanf("%d",&n); for (int u=1;u<=n;u++) scanf("%lf%lf",&s[u].x,&s[u].y); for (int u=2;u<=n;u++) { if (s[1].y-s[u].y>eps) swap(s[1],s[u]); else if (abs(s[1].y-s[u].y)
eps) swap(s[1],s[u]); } sort(s+2,s+1+n,cmp); sta[1]=1;sta[2]=2;top=2; for (int u=3;u<=n;u++) { while (top>2&&mul(s[u],s[sta[top]],s[sta[top-1]])>eps) top--; sta[++top]=u; } double ans=0; sta[++top]=sta[1]; for (int u=2;u<=top;u++) ans=ans+dis(s[sta[u]],s[sta[u-1]]); printf("%.4lf\n",ans); return 0;}

转载地址:http://vxcq.baihongyu.com/

你可能感兴趣的文章
mysql初始密码错误问题
查看>>
mysql判断某一张表是否存在的sql语句以及方法
查看>>
mysql加入安装策略_一键安装mysql5.7及密码策略修改方法
查看>>
mysql加强(1)~用户权限介绍、分别使用客户端工具和命令来创建用户和分配权限
查看>>
mysql加强(3)~分组(统计)查询
查看>>
mysql加强(4)~多表查询:笛卡尔积、消除笛卡尔积操作(等值、非等值连接),内连接(隐式连接、显示连接)、外连接、自连接
查看>>
mysql加强(5)~DML 增删改操作和 DQL 查询操作
查看>>
mysql加强(6)~子查询简单介绍、子查询分类
查看>>
mysql加强(7)~事务、事务并发、解决事务并发的方法
查看>>
mysql千万级大数据SQL查询优化
查看>>
MySQL千万级大表优化策略
查看>>
MySQL单实例或多实例启动脚本
查看>>
MySQL压缩包方式安装,傻瓜式教学
查看>>
MySQL原理、设计与应用全面解析
查看>>
MySQL原理简介—1.SQL的执行流程
查看>>
MySQL参数调优详解
查看>>
mysql参考触发条件_MySQL 5.0-触发器(参考)_mysql
查看>>
MySQL及navicat for mysql中文乱码
查看>>
MySqL双机热备份(二)--MysqL主-主复制实现
查看>>
MySQL各个版本区别及问题总结
查看>>