【问题标题】:How to find minimum L such that k given segments with length L could cover n given points?如何找到最小 L 使得长度为 L 的 k 个给定段可以覆盖 n 个给定点?
【发布时间】: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

标签: algorithm puzzle


【解决方案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 不客气!介意接受答案吗? :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 2015-10-22
  • 2011-04-24
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
相关资源
最近更新 更多