描述
一条街道安装无线网络,需要放置M个路由器。整条街道上一共有N户居民,分布在一条直线上,每一户居民必须被至少一台路由器覆盖到。现在的问题是所有路由器的覆盖半径是一样的,我们希望用覆盖半径尽可能小的路由器来完成任务,因为这样可以节省成本。
(1 ≤ N, M ≤ 100000)
分析
首先这种问题可以采用二分答案的方法. 尝试当前路由器覆盖范围能否覆盖所有居民点. 那么这里如果采用二分半径的方法, 会出现实数, 所以采用 wxjlzbcd 的方法, 采用二分直径, 最后实数折半输出.
在尝试答案可行性的时候, 为了快速查找从当前居民点可以覆盖到的最远居民点, 再采用一次二分查找 (upper_bound) 找到刚好覆盖不到的一个点, 也就是下一个起点. 注意这里的几个变量的初值和边界值需要好好考虑一下.
代码