如何找到最小 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 个给定点?的主要内容,如果未能解决你的问题,请参考以下文章

51nod1672区间交

bzoj5102[POI2018]Prawnicy 堆

Uva 10003 Cutting Sticks (类似于最优矩阵连乘的dp)

广义差分

noi 2.6_6046数据包的调度机制(区间DP)

思维-CF-739A