poj 2079(旋转卡壳)
题意:求出平面内的点集所组成的面积最大的三角形。
解题思路:考虑凸包+旋转卡壳。面积最大的三角形的三点必定在凸包的顶点上,只不过这里要注意,三角形的边不一定就是凸包的边,有可能三角形相邻两点是横跨凸包的。
关键是如何找三个顶点。这里采用的类似于尺取法,先固定一个点,剩下的两个指针依次逆时针方向旋转,找到最大的面积。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;const int maxn = 50000;
const double eps = 1e-8;
struct Point
{double x,y;
}p[maxn],Stack[maxn];
int n,top;double Cross(Point a,Point b,Point c)
{ return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);
} double dis(Point a,Point b)
{ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
} int cmp(Point a,Point b)
{ if(Cross(a,b,p[0]) > eps) return 1; if(fabs(Cross(a,b,p[0])) < eps && dis(b,p[0]) - dis(a,p[0]) < eps) return 1; return 0;
}int Graham()
{sort(p+1,p+n,cmp);top = 2; Stack[0] = p[0]; Stack[1] = p[1]; Stack[2] = p[2];for(int i = 3; i < n; i++){ while(top >= 1 && Cross(p[i],Stack[top],Stack[top-1]) > eps){ top--; } Stack[++top]=p[i]; } return top;
}double rotating_calipers()//旋转卡壳
{int i,j=1,k=2;double ans=0;Stack[++top]=Stack[0];for(i=0; i<top; i++){/*边上的两点可以不是凸包上的点,WA无数次*/while(fabs(Cross(Stack[(k+1)%top],Stack[i],Stack[j])) > fabs(Cross(Stack[k],Stack[i],Stack[j])))k=(k+1)%top;while(fabs(Cross(Stack[k],Stack[i],Stack[(j+1)%top])) > fabs(Cross(Stack[k],Stack[i],Stack[j])))j=(j+1)%top;ans=max(ans,fabs(Cross(Stack[k],Stack[i],Stack[j])));}return ans;
}int main()
{while(scanf("%d",&n),n != -1){for(int i = 0; i < n; i++)scanf("%lf%lf",&p[i].x,&p[i].y);int k = 0; for(int i = 1;i < n; i++){ if(p[k].y > p[i].y || (p[k].y == p[i].y) && (p[k].x > p[i].x)){ k=i; } } swap(p[0],p[k]);Graham();printf("%.2lf\n",rotating_calipers()/2);}return 0;
}
poj 2079(旋转卡壳)相关推荐
- Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离
\(\color{#0066ff}{题目描述}\) 几千年前,有一个小王国位于太平洋的中部.王国的领土由两个分离的岛屿组成.由于洋流的冲击,两个岛屿的形状都变成了凸多边形.王国的国王想建立一座桥来连接 ...
- POJ 3608 旋转卡壳
思路: 旋转卡壳应用 注意点&边 边&边 点&点 三种情况 //By SiriusRen #include <cmath> #include <cstdi ...
- poj 3608 旋转卡壳求不相交凸包最近距离;
题目链接:http://poj.org/problem?id=3608 #include<cstdio> #include<cstring> #include<cmath ...
- poj 2187 Beauty Contest (凸包: 最远点对,最长直径 , 旋转卡壳法)
http://poj.org/problem?id=2187 题意: 最长的点对近距离的平方: 题解: 旋转卡壳法, 要注意的地方是,有 所有点共线的情况,所以,(求凸包时)要将,共线点去出 : ...
- poj 2187(旋转卡壳)
传送门 模板题,求凸包,用旋转卡壳求出最远点对. 因为把int弄成double,WA了好几次,差点对idy大神给的模板失去信心...不过事实证明idy的写法没问题,orz! #include<c ...
- POJ 2187 凸包+旋转卡壳
思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说 凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...
- POJ - 2187 Beauty Contest (求距离最远点对-凸包+旋转卡壳/枚举 (旋转卡壳学习))
链接:https://vjudge.net/problem/POJ-2187 题意:求求距离最远点对. 思路:肯定为凸包上的点,可枚举,也可根据凸包性质旋转卡壳求对踵点. 参考博客: https:// ...
- 算法学习:计算几何旋转卡壳
[定义] [对踵点]多边形上存在平行切线的两点 [多边形半径]多边形上任意两点的最大长度 [旋转卡壳] 选取y轴上,最高和最低的两个点,令两条平行于x轴的线切过这两点 然后我们开始让这两条线旋转 当一 ...
- 旋转卡壳凸包(不用一下子就学完所有)
目录 前言 参考博客 前置知识 1.极角排序 2.凸包(默认逆时针) 3.对踵点 旋转卡壳能解决的各类问题 1.计算距离 1.1凸多边形直径 1.2凸多边形宽 1.3凸多边形间最大距离 1.4凸多边形 ...
最新文章
- Linux 小知识翻译 - 「文件系统的种类」
- 全文搜索技术—Lucene
- -bash: xxx: command not found
- jdbc-------JDBCUtil类 工具类
- hadoop集群中客户端修改、删除文件失败
- 扩展编写jquery插件的方法
- JS格式化时间之后少了8个小时
- iOS开发证件要点详解
- cmd for语句的用法
- Virtual Studio 2010介绍及下载
- Install Tcpping on Linux
- 联想换机助手_三星s换机助手下载-三星S换机助手 安卓版v3.6.07.11-pc6手机下载
- 无线ap的ntp服务器,怎么配置cisco路由器的NTP
- 微信小程序怎么添加底部菜单按钮
- 米聊之死 雷军的“猪”折了腿?
- 净亏损大幅减少超90%,阿里影业“回归内容”的背后逻辑是什么?
- 《Head First设计模式(中文版)》
- w10解决qq,微信语音自己说话别人听不到
- 【salesforce Admin必备】-想到啥写点啥
- GPS天线类型和特点