题目大意:

给定n,接下来n行逆时针给定小岛的n个顶点

输出岛内离海最远的点与海的距离

半平面交模板题

将整个小岛视为由许多半平面围成

那么以相同的比例缩小这些半平面

一直到缩小到一个点时 那个点就是离海最远的点

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6. const double eps=1e-;
  7. double add(double a,double b) {
  8. if(abs(a+b)<eps*(abs(a)+abs(b))) return ;
  9. return a+b;
  10. }
  11. struct P{
  12. double x,y;
  13. P(){};
  14. P(double _x,double _y):x(_x),y(_y){};
  15. P operator - (P p) {
  16. return P(add(x,-p.x),add(y,-p.y)); }
  17. P operator + (P p) {
  18. return P(add(x,p.x),add(y,p.y)); }
  19. P operator * (double d) {
  20. return P(x*d,y*d); }
  21. double dot (P p) {
  22. return add(x*p.x,y*p.y); }
  23. double det (P p) {
  24. return add(x*p.y,-y*p.x); }
  25. }p[], py[];
  26. struct L {
  27. P p, v; // p为直线上一点 v为单位方向向量
  28. double ang; // 极角
  29. L(){};
  30. L(P _p,P _v):p(_p),v(_v){ ang=atan2(v.y,v.x); }
  31. bool operator < (const L& b)const {
  32. return ang<b.ang;
  33. }
  34. }l[], lp[];
  35. int n;
  36. double lenV(P p) {
  37. return sqrt(p.dot(p));
  38. } // 求p的长度
  39. P NV(P p) {
  40. double len=lenV(p);
  41. return P(-p.y/len,p.x/len);
  42. } // 求向量p的单位向量
  43. P ins(L a,L b) {
  44. return a.p+a.v*((b.v).det(a.p-b.p)/(a.v).det(b.v));
  45. } // 求a与b的交点
  46. bool onLeft(L l,P p) {
  47. return (l.v).det(p-l.p)>;
  48. } // 判断p是否在l的左侧
  49. int insHp() {
  50. sort(l,l+n); // 按极角排序
  51. int head,tail;
  52. vector <P> pi(n*); // 交点
  53. vector <L> li(n*); // 半平面
  54. li[head=tail=]=l[];
  55. for(int i=;i<n;i++) {
  56. while(head<tail && !onLeft(l[i],pi[tail-])) tail--;
  57. while(head<tail && !onLeft(l[i],pi[head])) head++;
  58. // 之前的半平面的交点是否都在当前半平面的左边 否则去掉
  59. li[++tail]=l[i]; // 将当前半平面加入
  60.  
  61. if(abs((li[tail].v).det(li[tail-].v))<eps) {// 若加入后发现与上一个半平面平行
  62. tail--; // 先把当前半平面去掉
  63. if(onLeft(li[tail],l[i].p)) // 若当前半平面在上一个半平面左边
  64. li[tail]=l[i]; // 说明当前半平面可将上一个覆盖
  65. }
  66. if(head<tail) pi[tail-]=ins(li[tail-],li[tail]);
  67. // 加入当前半平面新产生的交点
  68. // tail-1 是与上一个半平面产生的交点
  69. }
  70. while(head<tail && !onLeft(li[head],pi[tail-])) tail--;
  71. // 当前交点是否在一开始的半平面的左边 否则说明当前被开始的半平面覆盖
  72. if(tail-head<=) return ;
  73. pi[tail]=ins(li[tail],li[head]); // 加入与第一个半平面的交点
  74. int m=;
  75. for(int i=head;i<=tail;i++)
  76. py[m++]=pi[i]; // 将半平面的内核顶点存入
  77. return m; // 返回顶点数
  78. }
  79. int main()
  80. {
  81. while(~scanf("%d",&n)) {
  82. if(n==) break;
  83. for(int i=;i<n;i++)
  84. scanf("%lf%lf",&p[i].x,&p[i].y);
  85. for(int i=;i<n;i++) {
  86. lp[i].p=p[(i+)%n]-p[i];
  87. lp[i].v=NV(lp[i].p);
  88. }
  89. double le=,ri=;
  90. while(ri-le>eps) {
  91. // 二分
  92. double mid=le+(ri-le)/;
  93. for(int i=;i<n;i++)
  94. l[i]=L(p[i]+lp[i].v*mid,lp[i].p);
  95. // 以mid比例 收缩多边形
  96. int m=insHp();
  97. if(!m) ri=mid;
  98. else le=mid;
  99. }
  100. printf("%.6f\n",le);
  101. }
  102. return ;
  103. }

POJ 3525 /// 半平面交 模板的更多相关文章

  1. poj 3525 半平面交求多边形内切圆最大半径【半平面交】+【二分】

    <题目链接> 题目大意:给出一个四面环海的凸多边形岛屿,求出这个岛屿中的点到海的最远距离. 解题分析: 仔细思考就会发现,其实题目其实就是让我们求该凸多边形内内切圆的最大半径是多少.但是, ...

  2. POJ 3525 半平面交+二分

    二分所能形成圆的最大距离,然后将每一条边都向内推进这个距离,最后所有边组合在一起判断时候存在内部点 #include <cstdio> #include <cstring> # ...

  3. poj 1279 半平面交核面积

    Art Gallery Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6668   Accepted: 2725 Descr ...

  4. poj 1755 半平面交+不等式

    Triathlon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6461   Accepted: 1643 Descrip ...

  5. bzoj 2618 半平面交模板+学习笔记

    题目大意 给你n个凸多边形,求多边形的交的面积 分析 题意\(=\)给你一堆边,让你求半平面交的面积 做法 半平面交模板 1.定义半平面为向量的左侧 2.将所有向量的起点放到一个中心,以中心参照进行逆 ...

  6. POJ 半平面交 模板题 三枚

    给出三个半平面交的裸题. 不会的上百度上谷(gu)歌(gou)一下. 毕竟学长的语文是体育老师教的.(卡格玩笑,别当真.) 这种东西明白就好,代码可以当模板. //poj1474 Video Surv ...

  7. 再来一道测半平面交模板题 Poj1279 Art Gallery

    地址:http://poj.org/problem?id=1279 题目: Art Gallery Time Limit: 1000MS   Memory Limit: 10000K Total Su ...

  8. 半平面交模板(O(n*n)&& O(n*log(n))

    摘自http://blog.csdn.net/accry/article/details/6070621 首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分 ...

  9. bzoj 2618【半平面交模板】

    #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> usin ...

随机推荐

  1. 清理Visual Studio解决方案临时文件:Clean Visual Studio Solution Temporary File Build20160418

    复制保存到任意文件名.bat,放置在Visual Studio Solution目录下. 当Visual Studio Solution目录过于庞大或打算拷贝移动Visual Studio Solut ...

  2. ArcGIS version not specified.

    问题 在调用arcgis10 的ISurface用来取指定航线的地形时,这段代码在加载.dem时总是出错. 报: Fail to open raster dataset 解决方法: 在窗体中加载Map ...

  3. SPSS聚类分析:K均值聚类分析

    SPSS聚类分析:K均值聚类分析 一.概念:(分析-分类-K均值聚类) 1.此过程使用可以处理大量个案的算法,根据选定的特征尝试对相对均一的个案组进行标识.不过,该算法要求您指定聚类的个数.如果知道, ...

  4. PAT_A1083#List Grades

    Source: PAT A1083 List Grades (25 分) Description: Given a list of N student records with name, ID an ...

  5. CTF杂项思路工具分享————2019/5/30

    分享碰到的一些奇奇怪怪的杂项解题方式: 键盘坐标密码: 题目给出一段字符串:11 21 31 18 27 33 34 对照上面的表格,就可以很清晰的看出来密文为:QAZIJCV 猪圈码: 题目为: 一 ...

  6. 一.Python特点

    python第一节 简介 Python介绍 什么样的语言? 解释性语言:开发中没有编译的环节 交互式语言:在命令提示行执行python引擎,直接执行代码 面向对象语言:支持面向对象 优点 a.易学 b ...

  7. XML中的值得注意的"坑"

    XML严禁 & < ,建议 < > & ' "进行转义 XML中预定义了5个实体引用: < > & ' " 其中,'<' ...

  8. C#操作Word的+ CKEditor 輸出成Word文件(包含圖案上傳)

    C#操作Word 参考博文: C#操作word类文件 https://www.cnblogs.com/walking/p/3571068.html C#中的Office操作专栏(21) http:// ...

  9. JFinal教程

    自学JFinal总结 前言:每次搭建ssm框架时,就像搬家一样,非常繁杂,并且还容易出错.正好了解到JFinal极简,无需配置即可使用,在这里记录下学习的过程. 感谢:非常感谢此网站发布的教程,非常详 ...

  10. windows server 常用功能(一)

    最近做了一个windows server 2016的环境,也遇到了很多问题,作为一个新手,又没有很好的记录下解决方案,因为写这篇文章的时间有点晚,因此只能留下一些思路以供参考. 1.作为一个serve ...