假设给你一组区间,每个区间的起始时间为s下标i,f下标i的结束时间.找到需要放置的最小点数,每个间隔都有一个点.
我正在尝试找到一种可以解决这个问题的算法.当一个重叠两个间隔的间隔,即在一个间隔的中间开始,在另一个间隔的中间结束时,我会卡在其中.
谢谢
小智 5
most_recent_placed为-inf(小于所有区间下限的值)。[a, b],如果most_recent_placed < a,则在 处放置一个点b并设置most_recent_placed为b。这个解 A 是最优的证明是归纳地确定对于任何有效解 B 和任何点x,B 放置的坐标小于x的点数至少与 A 放置的点数一样大x。
这个问题需要用代码来回答。这是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)
Run Code Online (Sandbox Code Playgroud)