假设给你一组间隔,每个间隔的开始时间为s下标i,f下标i的结束时间。找到需要放置的最小点数,每个区间都有一个点。
我正在尝试找到一种可以解决这个问题的算法。当一个重叠两个区间的区间,即从一个区间的中间开始,到另一个区间的中途结束时,我就会卡住它。
由于
答案 0 :(得分:7)
答案 1 :(得分:4)
most_recent_placed
初始化为-inf
(小于所有间隔下限)。[a, b]
,如果most_recent_placed < a
,请在b
处加点,并将most_recent_placed
设置为b
。此解决方案A最佳的证据是归纳地建立对于任何有效解B和任何点x
,由坐标小于x
的B放置的点数至少为大小为x
左边的点数。
答案 2 :(得分:1)
该问题需要代码回答。这是user612112提到的算法的python实现,比接受的答案中的实现好一点:
请注意,您不需要任何预处理即可删除多余的范围,也不需要进行排序以区分具有相同端点的多个范围。
# given some inclusive ranges
ranges=[(1,5),(2,4),(4,6),(3,7),(5,9),(6,6)]
# sort by the end points
ranges.sort(key=lambda p:p[1])
#generate required points
out=[]
last = None
for r in ranges:
if last == None or last < r[0]:
last = r[1]
out.append(last)
#print answer
print(out)
答案 3 :(得分:0)
首先按起点的递增顺序对间隔进行排序。 在最小的fi上加上一点。 如果具有结束时间f(i + 1)的下一个间隔具有该点,则前一点覆盖f(i + 1),否则将新点置于f(i + 1)。 迭代程序