POJ 3525 Most Distant Point from the Sea 二分+内推+半平面交

POJ 3525 Most Distant Point from the Sea (半平面交+二分求最大内切圆) Most Distant Point from the Sea Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 3476 Accepted: 1596 Special Judge Description The main l 阅读详情

题目描述:http://poj.org/problem?id=3525 


解题思路:

题目要求的是多边形内的点到边的距离的最小值的最大值。一般看到最小值的最大值和最大值的最小值这种问题第一反应就是二分.. 将最优性问题转化为可行性问题。所以我们可以二分点到边的最小距离D,如果存在点p使得Dp=D,那么可能有另外一个点p'使Dp'>D。

那么我们的问题转化成了,判断多边形内有没有一点使得这个点到边的最小距离为D。

如果这时候在草稿纸上写写画画,很容易就可以看出如果我们把每条边向多边形内推进D,求每条边决定的半平面的交,区域中的点到所有边的距离都>=D,区域边界上的点到某条边距离为D,到其他边距离>=D。所以如果交区域存在则证明有p满足条件,否则没有。

那么问题转化成了,二分最大距离,内推边,求半平面交。

至于内推边,假设有向边端点为(x1, y1)(x2, y2),令v=(x2-x1, y2-y1),移动向量m为(x, y)。因为m在v顺时针90°方向,所以m×v=|v|*d;因为v、m夹角为90°,所以v·m=0。联立两个方程解出(x, y),那么平移后的端点就是(x1+x, y1+y)、(x2+x, y2+y)。


复杂度:

假设二分的范围为0到L,求半平面交为O(n^2),内推边为O(n),总复杂度为O(n^2*logL)。

/* 
 *  <span style="white-space:pre">	</span>2014.11.18
 *	Problem: 3525		
 *	Memory: 152K		Time: 0MS
 *	Language: C++		Result: Accepted
 *
 */
#include "iostream"
#include "cmath"
#define EPS 1e-8
#define MAXN 107
#define INF 1e6

struct Point {
	double x, y;
	Point(){}
	Point(double _x, double _y):x(_x),y(_y){}
}p[MAXN];
struct Line {
	Point a, b;
};

Point operator + (const Point &a, const Point &b) {
	return Point(a.x+b.x, a.y+b.y);
}
Point operator - (const Point &a, const Point &b) {
	return Point(a.x-b.x, a.y-b.y);
}

int n, cn;

void init() {
	double x, y;
	for (int i=1; i<=n; i++) scanf("%lf %lf", &p[i].x, &p[i].y);
	p[0] = p[n]; p[n+1] = p[1];
}

void trans(Line t[], double d) {
	Point v, vt;
	double l;
	for (int i=1; i<=n; i++) {
		v = p[i] - p[i-1];
		l = sqrt(pow(v.x, 2) + pow(v.y, 2));
		vt = Point(-v.y*d/l, v.x*d/l);
		t[i].b = p[i] + vt;
		t[i].a = p[i-1] + vt;
	}
	t[0] = t[n]; t[n+1] = t[1];
}

double cross(Point a, Point b, Point c) {  // 叉积
	Point v1 = b-a, v2 = c-a;
	return v1.x*v2.y - v2.x*v1.y;
}

Point intersect(Point p1, Point p2, Point p3, Point p4) { // 直线交点
	double a = p2.y-p1.y, b = -(p2.x-p1.x), c = p1.x*p2.y-p2.x*p1.y;
	double d = p4.y-p3.y, e = -(p4.x-p3.x), f = p3.x*p4.y-p4.x*p3.y;
	return Point((c*e-b*f)/(a*e-b*d), (c*d-a*f)/(b*d-a*e));
}

bool cut(Point c[], Point a, Point b) {  
	Point t[MAXN];
	int tn = 0;
	for (int i=1; i<=cn; i++) {
		if (cross(a, b, c[i])>=-EPS) t[++tn] = c[i];
		else {
			if (cross(a, b, c[i-1])>=EPS) t[++tn] = intersect(a, b, c[i], c[i-1]);
			if (cross(a, b, c[i+1])>=EPS) t[++tn] = intersect(a, b, c[i], c[i+1]);
		}
	}
	if (!tn) return false;
	for (int i=1; i<=tn; i++) c[i] = t[i];
	c[0] = c[cn=tn];
	c[cn+1] = c[1];
	return true;
}

bool planeIntersect(Line p[]) {
	Point c[MAXN];
	c[1] = Point(-INF, -INF); 
	c[2] = Point(-INF, INF);
	c[3] = Point(INF, INF);
	c[4] = Point(INF, -INF);
	cn = 4; c[0] = c[cn]; c[cn+1] = c[1];
	for (int i=1; i<=n; i++) {	// 枚举边, 切割现有凸包点集c, O(n^2)半平面交模板
		if (!cut(c, p[i].a, p[i].b)) return false;
	}
	return true;
}

int main() {
	scanf("%d", &n);
	while (n) {
		init();

		double lans = 0, rans = INF, mid;
		struct Line pt[MAXN];
		// 二分内推的距离
		while (fabs(lans-rans)>=1e-7) {
			mid = (lans+rans)/2;
			trans(pt, mid); 			   // 计算内推后的直线pt[]
			bool fit = planeIntersect(pt); // 检测核是否存在
			if (fit) lans = mid; else rans = mid;
		}
		mid = (lans+rans)/2;
		printf("%lf\n", mid);
		scanf("%d", &n);
	}
	return 0;
}



POJ3525/LA3890 Most Distant Point from the Sea 解题报告【计算几何】【二分答案】【半平面交】 POJ3525/LA3890 阅读详情

相关推荐

RDMA 出现背景、如何实现?如何测试连通性?

文章目录一、背景:1、传统的 网络通信:2、传统网络通信的问题:二、RDMA :1、出现背景:2、RDMA 简介:3、如何工作:4、RDMA 与 Infiniband 的关系:5、支持 RDMA 的其他协议:6、RDMA 的优势:7、通过 Infiniband 实现 RDMA :8、如何测试 RDMA 连通性:   一、背景: 1、传统的 网络通信:     &n...

郑泽林 2162

POJ 3525 Most Distant Point from the Sea 半平面交+二分

半平面交+二分 二分距离,判断是否有半平面交,精度要求很高 Most Distant Point from the Sea Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4163   Accepted: 1942   Special Judge

码代码的猿猿 1209

信捷XD/XL系列PLC与C#通信实战:Modbus-RTU协议详解(附完整代码)

本文详细介绍了信捷XD/XL系列PLC与C#通过Modbus-RTU协议实现高效通信的实战指南。从硬件连接到软件配置,再到核心通信功能的实现与优化,提供了完整的代码示例和工业级应用建议,帮助开发者快速构建稳定的自动化通信系统。

weixin_28292761的博客 511

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

DescriptionThe main land of Japan called Honshu is an island surrounded by the sea. In such an island, it is natural to ask a question: “Where is the most distant point from the sea?” The answer to thi

Ab.Ever 847

200SMART PLC时间不准?手把手教你用MCGS触摸屏实现自动校时(附完整代码)

本文针对西门子200SMART PLC时钟不准的常见问题,提供了一套基于MCGS触摸屏的自动校时解决方案。文章详细阐述了时钟偏差的根源、时间同步方案的技术选型,并手把手指导如何配置MCGS与PLC的通信,以及编写完整的PLC时间读取、转换与设置代码,最终实现稳定可靠的自动时间同步功能。

jupyter5notebook的博客 452

Bertopic库安装(二)

Bertopic库安装

weixin_43392789的博客 4893

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

POJ - 3525 E - Most Distant Point from the Sea 题意:给你一个日本, 日本中有一个地方, 离海的最近距离比其他地方的最近距离都大.要你求该地到海的最近距离. 也就是给你一个凸包, 在里面放一个最大的圆, 求出圆的半径 解法: 可以二分半径 每次将所有线段向圆心平移mid个单位长度 如果还存在核,则l=mid,否则r=mid 代码: #include&l...

0ng的博客 1041

M2DGR数据集在一些SLAM框架上的配置与运行:ORB-SLAM系列、VINS-Mono、LOAM系列、FAST-LIO系列、hdl_graph_slam

为了说明以上这些SLAM框架的测试与数据集适配,以M2DGR数据集为例进行各自的配置与运行,方便我以后适配自己的数据集,运行的SLAM框架包括:ORB-SLAM2、ORB-SLAM3、VINS-Mono、A-LOAM、LeGO-LOAM、LIO-SAM、LVI-SAM、FAST-LIO2、FAST-LIVO、Faster-LIO、hdl_graph_slam。实验基于Ubuntu20.04,其中ORB、VINS-Mono、和LOAM系列的安装参考我以前的博客,有详细的安装方法,其他的框架在后面会简单介绍一下

zardforever123的博客 1万+

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

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

ACTerminate的博客 711

6、核函数与再生核希尔伯特空间:原理、应用与实践

本文系统介绍了核函数与再生核希尔伯特空间(RKHS)的理论基础、核心性质及其在机器学习和信号处理中的广泛应用。文章从核方法的优势出发,阐述了其在非线性建模、正则化和算法核化方面的独特价值,并深入探讨了正定核、Mercer定理、表示定理等关键理论。通过构建多种标准核与工程专用核,展示了核函数的设计灵活性。结合支持向量回归(SVR)模型与多个MATLAB示例,详细说明了核方法的实际应用流程与操作技巧。最后,总结了核方法的应用领域、未来发展方向及学习实践建议,为读者提供了一套完整的理论与实践指南。

z2a3b4c5d的博客 143

ESD防护设计宝典(十九):元器件选型宝典——共模电感

然而,这位“大师”的脾气也颇为古怪,若设计者不解其性、用之不当,它非但不能抑制噪声,反而会引入信号完整性恶化、电源压降等新问题,甚至让您的系统EMC性能“雪上加霜”,导致项目在测试阶段功亏一篑。本文将带您深入共模电感的内在世界,从本质解析到参数详解,从设计陷阱到实战选型,全方位领悟其平衡艺术,掌握其应用核心,规避那些足以让项目翻车的致命陷阱。:这是存在于电路板内部的“家贼”。共模电感实质上是一个四端器件,它通过磁场的“加法”与“减法”运算,巧妙地实现了对共模噪声的抑制,同时为差模信号大开绿灯。

m0_56451176的博客 421

【POJ3525】Most Distant Point from the Sea(半平面交+二分+直线平移)

题目地址:http://poj.org/problem?id=3525 题目: 给出一个形状为凸多边形的小岛,四周环海,求小岛内一点距海的最远距离,输出距离。 解题思路: 相当于在凸多边形内找一点,使得这个点到所有边的垂直距离的最小值最大。也即找到一个最大的圆,使得圆在凸多边形内和凸多边形相切。 半平面:有向直线左侧的区域。 可以二分答案,判断是否有距离凸多边形的每条边长度为d的...

Cassie_zkq的博客 396

使用 Simulink 实现基于相控阵雷达的波束形成技术

摘要:本文详细介绍了利用MATLAB Simulink和Phased Array System工具箱实现相控阵雷达波束形成的完整流程。主要内容包括:1)创建Simulink模型;2)设计天线阵列参数;3)信号生成模块配置;4)波束形成算法实现;5)结果可视化方法;6)仿真调试与优化;7)代码导出与部署。通过分步指导,读者可以掌握从理论到实践的完整开发流程,包括关键参数设置和算法实现示例。该方案适用于军事、气象等领域的雷达系统开发,并支持后续嵌入式和智能算法集成。

xiaoheshang_123的博客 179

poj 3525 Most Distant Point from the Sea(多边形内最大圆)

Most Distant Point from the Sea Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2971   Accepted: 1338   Special Judge Description The main land of Japan ca

志当存高远 825

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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

题目: The main land of Japan called Honshu is an island surrounded by the sea. In such an island, it is natural to ask a question: “Where is the most distant point from the sea?” The answer to this que...

slark_的博客 308

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

POJ3525 Most Distant Point from the Sea 半平面交

半平面交+二分  向内推进 求多边形内切圆半径 Most Distant Point from the Sea Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3433   Accepted: 1571   Special Judge Descripti

691

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

poj3525 Most Distant Point from the Sea

题目描述: vjudge POJ 题解: 二分答案+半平面交。 半径范围在0到5000之间二分,每次取$mid$然后平移所有直线,判断半平面交面积是否为零。 我的eps值取的是$10^{-12}$,36ms,而且和样例一样。 (大力推荐) 代码: #include<cmath> #include<vector> #include&lt...

a6t2007的博客 148

POJ - 3525 Most Distant Point from the Sea【半平面交求凸多边形最大内切圆】

The main land of Japan called Honshu is an island surrounded by the sea. In such an island, it is natural to ask a question: “Where is the most distant point from the sea?” The answer to this question...

slass-mot-odet 493

POJ 3525 || Most Distant Point from the Sea (凸包求最大内接圆,半平面交内推r

题目在问这样一个问题:给定一个凸多边形,找到其中的一个点,使得其到每条边的距离最小值最大,输出这个距离。 其实就是在问你,这个多边形中最大的一个内切圆有多大。 怎么做呢?如果我们事先知道一个半径R,我们是不是能验证这个R是否可行呢? 答案是肯定的,这样想:如果我们把这个多边形每条边都向内推进R,之后如果这个多边形还存在的话,就说明这个半径为R的圆肯定塞得下,因为还可以往里缩嘛。直

野生 1289

POJ 3525 Most Distant Point from the Sea (banpingmianjiao)

Description The main land of Japan called Honshu is an island surrounded by the sea. In such an island, it is natural to ask a question: “Where is the most distant point from the sea?” The answer

Misdom_Tian_Ya的专栏 530

POJ3525 Most Distant Point from the Sea

半平面交+二分 二分最远距离把每个直线往里移这个距离然后看一下半平面交是否存在就好 然后注意精度问题 【poj G++需要用%f C++没有问题 //Love and Freedom. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> ...

weixin_34417814的博客 153

[凸多边形最大内切圆][半平面交]Most Distant Point from the Sea POJ3525

The main land of Japan called Honshu is an island surrounded by the sea. In such an island, it is natural to ask a question: “Where is the most distant point from the sea?” The answer to this question for Honshu was found in 1996. The most distant point is

Cloth的博客 324

poj3525 Most Distant Point from the Sea(半平面交+二分)

qwq我是个睿智 首先,题目要求的是给定的一个凸多边形中距离边缘最远的点的距离是多少 qwq由于没有求最远的关键点之类的,所以我们并不好通过一些手段来直接求出来距离是多少。 那么就想到了二分距离 如果我们将原图的每条有向直线,逆时针构造,然后将左边视为他代表的半平面的话,那么问题就能够转化成,我们将原图中每一条边向内部(或者是直接说成沿着垂直方向)向内部平移midmidmid的距离后,判断是否存在...

y_immortal的博客 QwQ(qdez_ymh) 247

poj3525Most Distant Point from the Sea【半平面交求到凸多边形边界最远距离】

Language: Default Most Distant Point from the Sea Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 4285   Accepted: 2010   Special Judge Description The

走一步再走一步 1345

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 island, it is natural to ask a question: “Where is the most distant point from the sea?” The ans...

dddddd12345456的博客 143
上一篇: POJ 3335 Rotating Scoreboard 半平面的交
下一篇: POJ 1755 Triathlon 判断不等式有解+半平面的交
f_cpp
博客等级 码龄12年 0粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值