题意:求出平面内的点集所组成的面积最大的三角形。

解题思路:考虑凸包+旋转卡壳。面积最大的三角形的三点必定在凸包的顶点上,只不过这里要注意,三角形的边不一定就是凸包的边,有可能三角形相邻两点是横跨凸包的。

关键是如何找三个顶点。这里采用的类似于尺取法,先固定一个点,剩下的两个指针依次逆时针方向旋转,找到最大的面积。

#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(旋转卡壳)相关推荐

  1. Bridge Across Islands POJ - 3608 旋转卡壳求凸包最近距离

    \(\color{#0066ff}{题目描述}\) 几千年前,有一个小王国位于太平洋的中部.王国的领土由两个分离的岛屿组成.由于洋流的冲击,两个岛屿的形状都变成了凸多边形.王国的国王想建立一座桥来连接 ...

  2. POJ 3608 旋转卡壳

    思路: 旋转卡壳应用 注意点&边  边&边  点&点 三种情况 //By SiriusRen #include <cmath> #include <cstdi ...

  3. poj 3608 旋转卡壳求不相交凸包最近距离;

    题目链接:http://poj.org/problem?id=3608 #include<cstdio> #include<cstring> #include<cmath ...

  4. poj 2187 Beauty Contest (凸包: 最远点对,最长直径 , 旋转卡壳法)

    http://poj.org/problem?id=2187 题意: 最长的点对近距离的平方: 题解: 旋转卡壳法, 要注意的地方是,有 所有点共线的情况,所以,(求凸包时)要将,共线点去出 :    ...

  5. poj 2187(旋转卡壳)

    传送门 模板题,求凸包,用旋转卡壳求出最远点对. 因为把int弄成double,WA了好几次,差点对idy大神给的模板失去信心...不过事实证明idy的写法没问题,orz! #include<c ...

  6. POJ 2187 凸包+旋转卡壳

    思路: 求个凸包 旋转卡壳一下 就求出来最远点对了 注意共线情况 也就是说   凸包如果有一堆点共线保留端点即可 //By SiriusRen #include <cmath> #incl ...

  7. POJ - 2187 Beauty Contest (求距离最远点对-凸包+旋转卡壳/枚举 (旋转卡壳学习))

    链接:https://vjudge.net/problem/POJ-2187 题意:求求距离最远点对. 思路:肯定为凸包上的点,可枚举,也可根据凸包性质旋转卡壳求对踵点. 参考博客: https:// ...

  8. 算法学习:计算几何旋转卡壳

    [定义] [对踵点]多边形上存在平行切线的两点 [多边形半径]多边形上任意两点的最大长度 [旋转卡壳] 选取y轴上,最高和最低的两个点,令两条平行于x轴的线切过这两点 然后我们开始让这两条线旋转 当一 ...

  9. 旋转卡壳凸包(不用一下子就学完所有)

    目录 前言 参考博客 前置知识 1.极角排序 2.凸包(默认逆时针) 3.对踵点 旋转卡壳能解决的各类问题 1.计算距离 1.1凸多边形直径 1.2凸多边形宽 1.3凸多边形间最大距离 1.4凸多边形 ...

最新文章

  1. Linux 小知识翻译 - 「文件系统的种类」
  2. 全文搜索技术—Lucene
  3. -bash: xxx: command not found
  4. jdbc-------JDBCUtil类 工具类
  5. hadoop集群中客户端修改、删除文件失败
  6. 扩展编写jquery插件的方法
  7. JS格式化时间之后少了8个小时
  8. iOS开发证件要点详解
  9. cmd for语句的用法
  10. Virtual Studio 2010介绍及下载
  11. Install Tcpping on Linux
  12. 联想换机助手_三星s换机助手下载-三星S换机助手 安卓版v3.6.07.11-pc6手机下载
  13. 无线ap的ntp服务器,怎么配置cisco路由器的NTP
  14. 微信小程序怎么添加底部菜单按钮
  15. 米聊之死 雷军的“猪”折了腿?
  16. 净亏损大幅减少超90%,阿里影业“回归内容”的背后逻辑是什么?
  17. 《Head First设计模式(中文版)》
  18. w10解决qq,微信语音自己说话别人听不到
  19. 【salesforce Admin必备】-想到啥写点啥
  20. GPS天线类型和特点

热门文章

  1. Linux timer调用流程图,Linux应用层的定时器Timer使用详解【转】
  2. 安信证券王环:安信证券数据中台建设历程
  3. 包图网签约神策数据,助力产品优化
  4. SQL Server数据库中使用sql脚本删除指定表的列
  5. 雷林鹏分享:PHP 数组
  6. 【从前端到全栈】- koa快速入门指南
  7. 解决Intellij IDEA部署JavaWeb项目 404问题
  8. C#变量命名的几种方式—C#基础回顾
  9. PostgreSQL · 特性介绍 · 全文搜索介绍
  10. 关于学习的一则小故事