博客
关于我
凸包模板
阅读量: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 I 有福啦,窗口函数大大提高了取数的效率!
查看>>
mysql id自动增长 初始值 Mysql重置auto_increment初始值
查看>>
MySQL in 太多过慢的 3 种解决方案
查看>>
MySQL InnoDB 三大文件日志,看完秒懂
查看>>
Mysql InnoDB 数据更新导致锁表
查看>>
Mysql Innodb 锁机制
查看>>
MySQL InnoDB中意向锁的作用及原理探
查看>>
MySQL InnoDB事务隔离级别与锁机制深入解析
查看>>
Mysql InnoDB存储引擎 —— 数据页
查看>>
Mysql InnoDB存储引擎中的checkpoint技术
查看>>
Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
查看>>
MySQL InnoDB引擎的锁机制详解
查看>>
Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
查看>>
mysql InnoDB数据存储引擎 的B+树索引原理
查看>>
mysql innodb通过使用mvcc来实现可重复读
查看>>
mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
查看>>
mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
查看>>
Mysql join原理
查看>>
MySQL Join算法与调优白皮书(二)
查看>>
Mysql order by与limit混用陷阱
查看>>