如何找到最小 L 使得长度为 L 的 k 个给定段可以覆盖 n 个给定点?
Posted
技术标签:
【中文标题】如何找到最小 L 使得长度为 L 的 k 个给定段可以覆盖 n 个给定点?【英文标题】:How to find minimum L such that k given segments with length L could cover n given points? 【发布时间】:2021-11-14 15:50:24 【问题描述】:x轴上有n个点,每个点都有一个整数坐标,范围为[0, n^3 ]。我们可以用 k 个线段覆盖这些点,每个线段长度为 L(一个线段可以覆盖其中的所有点,包括端点)。 给定k和n,如何在O(nlogn)时间内求出最小L?
我认为如果n0,但是当n>k时,事情就开始变得复杂了,希望你能帮帮我。
【问题讨论】:
到目前为止您尝试过什么?您是否有一个比O(n log n)
复杂度更高的有效算法并正在尝试优化?
您好,请添加您尝试过的minimal reproducible example
【参考方案1】:
首先,对L
进行二分搜索。假设有一个魔术函数check(L)
返回是否可以覆盖长度为L
的点,我们使用二分搜索找到最小L
使得check(L)
返回true。
那么,让我们来实现那个神奇的功能吧。我们可以贪婪地放置我们的线段:找到最左边未被覆盖的点,并放置一个线段,使其左端点位于该点。重复此k
次,并检查是否已覆盖所有n
点。
二进制搜索调用check(L)
O(log n)
次,如果我们有一个点的顺序列表(只需从左到右扫描数组),每次调用check(L)
都需要O(n)
,总共是O(n log n)
.由于点列表没有改变,我们可以对列表进行预排序,这也需要O(n log n)
时间。所以这个算法的时间复杂度是O(n log n)
。
【讨论】:
晶莹剔透,非常感谢! @Sakura 不客气!介意接受答案吗? :)以上是关于如何找到最小 L 使得长度为 L 的 k 个给定段可以覆盖 n 个给定点?的主要内容,如果未能解决你的问题,请参考以下文章