题目就是求多变形内部一点。 使得到任意边距离中的最小值最大。

那么我们想一下,可以发现其实求是看一个圆是否能放进这个多边形中。

那么我们就二分这个半径r,然后将多边形的每条边都往内退r距离。

求半平面交看是否存在解即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <map>
#include <sstream>
#include <queue>
#include <vector>
#define MAXN 111111
#define MAXM 211111
#define PI acos(-1.0)
#define eps 1e-8
#define INF 1000000001
using namespace std;
int dblcmp(double d)
{
if (fabs(d) < eps) return 0;
return d > eps ? 1 : -1;
}
struct point
{
double x, y;
point(){}
point(double _x, double _y):
x(_x), y(_y){};
void input()
{
scanf("%lf%lf",&x, &y);
}
double dot(point p)
{
return x * p.x + y * p.y;
}
double distance(point p)
{
return hypot(x - p.x, y - p.y);
}
point sub(point p)
{
return point(x - p.x, y - p.y);
}
double det(point p)
{
return x * p.y - y * p.x;
}
bool operator == (point a)const
{
return dblcmp(a.x - x) == 0 && dblcmp(a.y - y) == 0;
}
bool operator < (point a)const
{
return dblcmp(a.x - x) == 0 ? dblcmp(y - a.y) < 0 : x < a.x;
} }p[MAXN];
struct line
{
point a,b;
line(){}
line(point _a,point _b)
{
a=_a;
b=_b;
}
bool parallel(line v)
{
return dblcmp(b.sub(a).det(v.b.sub(v.a))) == 0;
}
point crosspoint(line v)
{
double a1 = v.b.sub(v.a).det(a.sub(v.a));
double a2 = v.b.sub(v.a).det(b.sub(v.a));
return point((a.x * a2 - b.x * a1) / (a2 - a1), (a.y * a2 - b.y * a1) / (a2 - a1));
}
bool operator == (line v)const
{
return (a == v.a) && (b == v.b);
}
};
struct halfplane:public line
{
double angle;
halfplane(){}
//表示向量 a->b逆时针(左侧)的半平面
halfplane(point _a, point _b)
{
a = _a;
b = _b;
}
halfplane(line v)
{
a = v.a;
b = v.b;
}
void calcangle()
{
angle = atan2(b.y - a.y, b.x - a.x);
}
bool operator <(const halfplane &b)const
{
return angle < b.angle;
}
};
struct polygon
{
int n;
point p[MAXN];
line l[MAXN];
double area;
void getline()
{
for (int i = 0; i < n; i++)
{
l[i] = line(p[i], p[(i + 1) % n]);
}
}
void getarea()
{
area = 0;
int a = 1, b = 2;
while(b <= n - 1)
{
area += p[a].sub(p[0]).det(p[b].sub(p[0]));
a++;
b++;
}
area = fabs(area) / 2;
}
}convex;
struct halfplanes
{
int n;
halfplane hp[MAXN];
point p[MAXN];
int que[MAXN];
int st, ed;
void push(halfplane tmp)
{
hp[n++] = tmp;
}
void unique()
{
int m = 1, i;
for (i = 1; i < n;i++)
{
if (dblcmp(hp[i].angle - hp[i - 1].angle))hp[m++] = hp[i];
else if (dblcmp(hp[m - 1].b.sub(hp[m - 1].a).det(hp[i].a.sub(hp[m - 1].a)) > 0))hp[m - 1] = hp[i];
}
n = m;
}
bool halfplaneinsert()
{
int i;
for (i = 0; i < n; i++) hp[i].calcangle();
sort(hp, hp + n);
unique();
que[st = 0] = 0;
que[ed = 1] = 1;
p[1] = hp[0].crosspoint(hp[1]);
for (i = 2; i < n; i++)
{
while (st < ed && dblcmp((hp[i].b.sub(hp[i].a).det(p[ed].sub(hp[i].a)))) < 0) ed--;
while (st < ed && dblcmp((hp[i].b.sub(hp[i].a).det(p[st + 1].sub(hp[i].a)))) < 0) st++;
que[++ed] = i;
if (hp[i].parallel(hp[que[ed - 1]])) return false;
p[ed] = hp[i].crosspoint(hp[que[ed - 1]]);
}
while (st < ed && dblcmp(hp[que[st]].b.sub(hp[que[st]].a).det(p[ed].sub(hp[que[st]].a))) < 0) ed--;
while (st < ed && dblcmp(hp[que[ed]].b.sub(hp[que[ed]].a).det(p[st + 1].sub(hp[que[ed]].a))) < 0) st++;
if (st + 1 >= ed)return false;
return true;
}
void getconvex(polygon &con)
{
p[st] = hp[que[st]].crosspoint(hp[que[ed]]);
con.n = ed - st + 1;
int j = st, i = 0;
for (; j <= ed; i++, j++)
{
con.p[i] = p[j];
}
}
}h;
int T;
int n;
line getmove(point a, point b, double mid)
{
double x = a.x - b.x;
double y = a.y - b.y;
double L = a.distance(b);
point ta = point(mid * y / L + a.x, a.y - mid * x / L);
point tb = point(mid * y / L + b.x, b.y - mid * x / L);
return line(ta, tb);
}
bool check(double mid)
{
h.n = 0;
for(int i = 0; i < n; i++)
{
line tmp = getmove(p[i], p[(i + 1) % n], mid);
h.push(halfplane(tmp));
}
return h.halfplaneinsert();
}
int main()
{
int cas = 0;
while(scanf("%d", &n) != EOF && n)
{
for(int i = 0; i < n; i++) p[i].input();
double low = 0, high = INF;
for(int i = 0; i < 100; i++)
{
double mid = (low + high) / 2;
if(check(mid)) low = mid;
else high = mid;
}
printf("%.6f\n", low);
}
return 0;
}

POJ 3525 Most Distant Point from the Sea 二分+半平面交的更多相关文章

  1. POJ 3525 Most Distant Point from the Sea (半平面交+二分)

    Most Distant Point from the Sea Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3476   ...

  2. POJ 3525 Most Distant Point from the Sea [半平面交 二分]

    Most Distant Point from the Sea Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5153   ...

  3. POJ 3525 Most Distant Point from the Sea (半平面交)

    Description The main land of Japan called Honshu is an island surrounded by the sea. In such an isla ...

  4. POJ 3525 Most Distant Point from the Sea

    http://poj.org/problem?id=3525 给出一个凸包,要求凸包内距离所有边的长度的最小值最大的是哪个 思路:二分答案,然后把凸包上的边移动这个距离,做半平面交看是否有解. #in ...

  5. POJ 3525 Most Distant Point from the Sea (半平面交向内推进+二分半径)

    题目链接 题意 : 给你一个多边形,问你里边能够盛的下的最大的圆的半径是多少. 思路 :先二分半径r,半平面交向内推进r.模板题 #include <stdio.h> #include & ...

  6. POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交

    题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...

  7. poj 3335 Rotating Scoreboard - 半平面交

    /* poj 3335 Rotating Scoreboard - 半平面交 点是顺时针给出的 */ #include <stdio.h> #include<math.h> c ...

  8. poj 3384 半平面交

    Feng Shui Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5183   Accepted: 1548   Speci ...

  9. POJ 2540 Hotter Colder --半平面交

    题意: 一个(0,0)到(10,10)的矩形,目标点不定,从(0,0)开始走,如果走到新一点是"Hotter",那么意思是离目标点近了,如果是"Colder“,那么就是远 ...

随机推荐

  1. Codeforces Round #368 (Div. 2) C. Pythagorean Triples 数学

    C. Pythagorean Triples 题目连接: http://www.codeforces.com/contest/707/problem/C Description Katya studi ...

  2. FireDAC 下的 Sqlite [10] - 使用 R-Tree 搜索

    R-Tree 主要用于三维空间的搜索, 据说这种搜索算法非常之快, 哪怕百万条记录也是眨眼间的事! SQLite 支持 1-5 维, FireDAC 也提供了 TFDSQLiteRTree 控件以方便 ...

  3. x270

    https://thinkpad.lenovo.com.cn/product/93964.html

  4. Android中pm命令用法(转)

    usage: pm [list|path|install|uninstall] pm list packages [-f] pm list permission-groups pm list perm ...

  5. Context Switching on the Cortex-M3

    http://coactionos.com/embedded%20design%20tips/2013/10/09/Tips-Context-Switching-on-the-Cortex-M3/ T ...

  6. A股和B股票的区别?

    一.A股和B股的区别——概念不同 (一).A股的概念A股是由中国境内的公司发行,正式名称是人民币普通股票,供境内机构.组织或个人(从4月1日起,境内港.澳.台居民可开立A股账户)以人民币认购和交易的普 ...

  7. css 滚动条样式

    1,Overflow内容溢出时的设置 overflow 水平及垂直方向内容溢出时的设置 overflow-x 水平方向内容溢出时的设置 overflow-y 垂直方向内容溢出时的设置 以上三个属性设置 ...

  8. .NET:自定义配置节

    背景 对于编译型应用程序来说,参数化程序行为是非常有必要的,.NET有其标准的配置方法,我们可以可以扩展. 示例 代码 using System; using System.Collections; ...

  9. 推荐Java基础

    (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式 03. Java多线程系列--“基础篇”03之 T ...

  10. 删除数据库字段一样的row, 并增加唯一索引

    DELETE FROM `groups` WHERE name IN (select a.name from ( SELECT name FROM `groups` GROUP BY name HAV ...