POJ 3525 Most Distant Point from the Sea
2012-02-19 19:42
330 查看
POJ_3525
这个题目限制了是一个凸多边形,于是多边形所在的范围就等价于各个边所在的直线划分成的半平面的交,如果是凹多边形的话显然就不能这样等价了。
首先,我们可以把问题转化为求凸多边形的半径最大的内切圆,同时,我们会发现,如果各个边向内收缩r的话,内切圆的半径就会减少r,当缩到半平面交恰好不存在时,内切圆的半径也就为0了,这时向内收缩的距离r自然就是内切圆的最大半径了。
于是我们只要二分内切圆的半径r作为各条边向内收缩的距离,然后判断这时半平面交是否为空集即可,如果为空则说明向内收缩的过头了,于是就要更新max,否则就更新min。
值得一提的是,当半平面交恰好不存在时(或者说恰好存在时),半平面交表示的就是半径最大的内切圆的圆心。
这个题目限制了是一个凸多边形,于是多边形所在的范围就等价于各个边所在的直线划分成的半平面的交,如果是凹多边形的话显然就不能这样等价了。
首先,我们可以把问题转化为求凸多边形的半径最大的内切圆,同时,我们会发现,如果各个边向内收缩r的话,内切圆的半径就会减少r,当缩到半平面交恰好不存在时,内切圆的半径也就为0了,这时向内收缩的距离r自然就是内切圆的最大半径了。
于是我们只要二分内切圆的半径r作为各条边向内收缩的距离,然后判断这时半平面交是否为空集即可,如果为空则说明向内收缩的过头了,于是就要更新max,否则就更新min。
值得一提的是,当半平面交恰好不存在时(或者说恰好存在时),半平面交表示的就是半径最大的内切圆的圆心。
#include<stdio.h> #include<string.h> #include<math.h> #define MAXD 210 #define zero 1e-8 #define INF 10010 struct point { double x, y; }p[MAXD], wa[MAXD], wb[MAXD], *a, *b; int N, na, nb; double det(double x1, double y1, double x2, double y2) { return x1 * y2 - x2 * y1; } int dcmp(double x) { return fabs(x) < zero ? 0 : (x < 0 ? -1 : 1); } double sqr(double x) { return x * x; } void init() { int i, j, k; for(i = 0; i < N; i ++) scanf("%lf%lf", &p[i].x, &p[i].y); p = p[0]; } void add(double x, double y) { b[nb].x = x, b[nb].y = y; ++ nb; } void cut(int k, double r) { int i, j; double x, y, t1, t2, dx, dy; point *t; nb = 0; t1 = sqrt(sqr(p[k + 1].x - p[k].x) + sqr(p[k + 1].y - p[k].y)); dx = (p[k + 1].y - p[k].y) / t1 * r, dy = (p[k].x - p[k + 1].x) / t1 * r; for(i = 0; i < na; i ++) { t1 = det(p[k + 1].x - p[k].x, p[k + 1].y - p[k].y, a[i].x + dx - p[k].x, a[i].y + dy - p[k].y); t2 = det(p[k + 1].x - p[k].x, p[k + 1].y - p[k].y, a[i + 1].x + dx - p[k].x, a[i + 1].y + dy - p[k].y); if(dcmp(t1) >= 0) add(a[i].x, a[i].y); if(dcmp(t1) * dcmp(t2) < 0) { x = (fabs(t2) * a[i].x + fabs(t1) * a[i + 1].x) / (fabs(t1) + fabs(t2)); y = (fabs(t2) * a[i].y + fabs(t1) * a[i + 1].y) / (fabs(t1) + fabs(t2)); add(x, y); } } t = a, a = b, b = t; na = nb; a[na] = a[0]; } void solve() { int i, j, k; double min, mid, max; min = 0, max = INF; for(k = 0; k < 100; k ++) { mid = (min + max) / 2; a = wa, b = wb; na = 4; a[0].x = -INF, a[0].y = -INF, a[1].x = INF, a[1].y = -INF, a[2].x = INF, a[2].y = INF, a[3].x = -INF, a[3].y = INF; a[na] = a[0]; for(i = 0; i < N; i ++) cut(i, mid); if(na == 0) max = mid; else min = mid; } printf("%.6lf\n", mid); } int main() { for(;;) { scanf("%d", &N); if(!N) break; init(); solve(); } return 0; }
相关文章推荐
- POJ 3525 Most Distant Point from the Sea 二分+内推+半平面交
- POJ 3525 Most Distant Point from the Sea (半平面交+二分)
- POJ 3525 Most Distant Point from the Sea 半平面交判多边形存在
- POJ 3525 Most Distant Point from the Sea(半平面交+二分)
- POJ 3525 Most Distant Point from the Sea 二分+半平面交
- POJ 3525 Most Distant Point from the Sea (二分答案+半平面交)
- poj 3525 Most Distant Point from the Sea(半平面交+二分内推进)
- POJ 3525 Most Distant Point from the Sea
- POJ 3525/UVA 1396 Most Distant Point from the Sea(二分+半平面交)
- poj 3525 Most Distant Point from the Sea(多边形内最大圆)
- POJ 3525: Most Distant Point from the Sea 半平面交 二分
- POJ 3525 Most Distant Point from the Sea [半平面交 二分]
- poj 3525 Most Distant Point from the Sea
- 【POJ】【3525】Most Distant Point from the Sea
- POJ 3525 Most Distant Point from the Sea
- POJ 3525 Most Distant Point from the Sea (半平面交+二分求最大内切圆)
- poj 3525 Most Distant Point from the Sea(二分+半平面交)
- Poj 3525 Most Distant Point from the Sea (二分+半平面求交)
- poj 3525 Most Distant Point from the Sea(半平面交+二分)
- POJ 3525 Most Distant Point from the Sea (banpingmianjiao)