博客
关于我
凸包模板
阅读量: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/

你可能感兴趣的文章
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 导出中文乱码
查看>>
mysqldump备份时忽略某些表
查看>>
mysqldump实现数据备份及灾难恢复
查看>>
mysqlreport分析工具详解
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL中B+Tree索引原理
查看>>
mysql中cast() 和convert()的用法讲解
查看>>
mysql中floor函数的作用是什么?
查看>>
MySQL中group by 与 order by 一起使用排序问题
查看>>
mysql中having的用法
查看>>
MySQL中interactive_timeout和wait_timeout的区别
查看>>
mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
查看>>
mysql中json_extract的使用方法
查看>>