题目大意:

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

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

半平面交模板题

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

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

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

#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
const double eps=1e-;
double add(double a,double b) {
if(abs(a+b)<eps*(abs(a)+abs(b))) return ;
return a+b;
}
struct P{
double x,y;
P(){};
P(double _x,double _y):x(_x),y(_y){};
P operator - (P p) {
return P(add(x,-p.x),add(y,-p.y)); }
P operator + (P p) {
return P(add(x,p.x),add(y,p.y)); }
P operator * (double d) {
return P(x*d,y*d); }
double dot (P p) {
return add(x*p.x,y*p.y); }
double det (P p) {
return add(x*p.y,-y*p.x); }
}p[], py[];
struct L {
P p, v; // p为直线上一点 v为单位方向向量
double ang; // 极角
L(){};
L(P _p,P _v):p(_p),v(_v){ ang=atan2(v.y,v.x); }
bool operator < (const L& b)const {
return ang<b.ang;
}
}l[], lp[];
int n;
double lenV(P p) {
return sqrt(p.dot(p));
} // 求p的长度
P NV(P p) {
double len=lenV(p);
return P(-p.y/len,p.x/len);
} // 求向量p的单位向量
P ins(L a,L b) {
return a.p+a.v*((b.v).det(a.p-b.p)/(a.v).det(b.v));
} // 求a与b的交点
bool onLeft(L l,P p) {
return (l.v).det(p-l.p)>;
} // 判断p是否在l的左侧
int insHp() {
sort(l,l+n); // 按极角排序
int head,tail;
vector <P> pi(n*); // 交点
vector <L> li(n*); // 半平面
li[head=tail=]=l[];
for(int i=;i<n;i++) {
while(head<tail && !onLeft(l[i],pi[tail-])) tail--;
while(head<tail && !onLeft(l[i],pi[head])) head++;
// 之前的半平面的交点是否都在当前半平面的左边 否则去掉
li[++tail]=l[i]; // 将当前半平面加入 if(abs((li[tail].v).det(li[tail-].v))<eps) {// 若加入后发现与上一个半平面平行
tail--; // 先把当前半平面去掉
if(onLeft(li[tail],l[i].p)) // 若当前半平面在上一个半平面左边
li[tail]=l[i]; // 说明当前半平面可将上一个覆盖
}
if(head<tail) pi[tail-]=ins(li[tail-],li[tail]);
// 加入当前半平面新产生的交点
// tail-1 是与上一个半平面产生的交点
}
while(head<tail && !onLeft(li[head],pi[tail-])) tail--;
// 当前交点是否在一开始的半平面的左边 否则说明当前被开始的半平面覆盖
if(tail-head<=) return ;
pi[tail]=ins(li[tail],li[head]); // 加入与第一个半平面的交点
int m=;
for(int i=head;i<=tail;i++)
py[m++]=pi[i]; // 将半平面的内核顶点存入
return m; // 返回顶点数
}
int main()
{
while(~scanf("%d",&n)) {
if(n==) break;
for(int i=;i<n;i++)
scanf("%lf%lf",&p[i].x,&p[i].y);
for(int i=;i<n;i++) {
lp[i].p=p[(i+)%n]-p[i];
lp[i].v=NV(lp[i].p);
}
double le=,ri=;
while(ri-le>eps) {
// 二分
double mid=le+(ri-le)/;
for(int i=;i<n;i++)
l[i]=L(p[i]+lp[i].v*mid,lp[i].p);
// 以mid比例 收缩多边形
int m=insHp();
if(!m) ri=mid;
else le=mid;
}
printf("%.6f\n",le);
}
return ;
}

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. JS对象的引用,对象的拷贝

    目录 一.场景 二.浅拷贝 三.深拷贝 一.场景 除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝 将一个对象赋值给另外一个对象. var a = [1,2,3]; ...

  2. 机器学习中python的有关使用技巧【创建虚拟环境、jupyter的kernel修改】

    1.创建虚拟环境<在原来基础上建立> *注:(这里是python2.python3环境共存,我要创建一个python3的虚拟环境) 一.先安装虚拟环境变量: pip3 install -U ...

  3. 1.4 React 组件生命周期

    1.4.1 组件 React 中组件有自己的生命周期方法,简单理解可以为组件从 出生(实例化) -> 激活 -> 销毁 生命周期 hook.通过这些 hook 方法可以自定义组件的特性. ...

  4. PAT_A1139#First Contact

    Source: PAT A1139 First Contact (30 分) Description: Unlike in nowadays, the way that boys and girls ...

  5. Codeforce 1182B Plus from Picture

    题目链接:http://codeforces.com/problemset/problem/1182/B 题意:检查图中 * 形成的是否是唯一的十字. 思路:dfs找到十字的中心,反向消除十字,最后检 ...

  6. C++公有继承、私有继承以及友元

    公有继承: 基类的成员在派生类中维持原来的访问权限,基类的publice成员为派生类的public成员,基类的protected成员为派生类的protected成员,基类的private成员在派生类的 ...

  7. scala 列表List

    列表: 列表是不可变,也就是说不能通过赋值改变列表的元素: 列表有递归结构,而数据是连续的 List 类型:List() 同样也是List(String) 列表是基于Nil (是空的)和::(列表从前 ...

  8. leetcode.字符串.12整数转罗马数字-Java

    1. 具体题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. I 1V   5X 10L     50C    100D    500M   1000例如, 罗马数字 2 写做  ...

  9. 巧用border属性

    border是常见的css2属性,大家的印象中是不是只是作为边框使用,如下所示: 事实上border,还可以当做图标去使用 我们先来看段代码 <style> .div1{ margin: ...

  10. 13、如何拆分含有多种分隔符的字符串 14、如何判断字符串a是否以字符串b开头或结尾 15、如何调整字符串中文本的格式 16、如何将多个小字符串拼接成一个大的字符串

    13.如何拆分含有多种分隔符的字符串 import re s = "23:41:2314\1234#sdf\23;" print(re.split(r'[#:\;]+',s))   ...