SPOJ AMR12C Entmoot(二分+圆的面积交)

博客介绍了如何解决一个问题,即找到一个点X,使得所有具有不同坐标和速度的人到达该点所需时间最长的人的时间最短。通过将问题转化为圆的面积交,使用二分法来枚举时间,并通过判断是否存在一个点位于所有半径为速度乘以时间的圆内来确定解决方案。由于没有现成的圆面积交模板,采用了求圆交点并进行极角排序的方法,找出所有圆内可见的区域来确定可行的时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意是有n个人,每个人有各自坐标以及速度,求一个点X,使得所有点走到X点,耗时最大的那个人的耗时最小。输出这个时间。

抽象成圆的面积交: 二分枚举时间将求极值问题转换为判定问题。如何判断是否存在一个点X,使得所有点都能在time时间内到达X? 每个人在time时间内的运动范围是以其初始座标为圆心,半径 v*time的一个圆。那么问题就很直观了,只要由time生成的这n个圆存在交,那么所有人就能在time时间内走到一起了。

不过悲剧的是我没有圆面积交的模板。。。所以只能换一种方法求圆的面积交:是否存在一个区域(任意规则),这个区域中有一个点在所有圆内?显然如果存在这样一个点,n个圆就有公共交了。 

具体求法:求出所有圆的交点,然后对于一个圆上所有的交点极角排序,如果连续两个交点的中间点能被“看见”,那么着这段弧所在的“区域”也就是“可见”的了。也就意味着当前time可解。

#include<algorithm>
#include<iostream>
#include<cstring&
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值