假设给定一组区间,每个区间的开始时间为s下标i,结束时间为f下标i。找出需要放置的最小点数,每个区间都有一个点。
我在试着找一个算法来解决这个问题。当重叠两个区间的区间,即一个区间开始于一个区间的中途,结束于另一个区间的中途,其中包含一个区间时,我就被卡住了。
谢谢
发布于 2011-02-11 04:41:53
放置点
发布于 2011-02-11 05:14:50
most_recent_placed to -inf (小于所有间隔下限的值)的顺序对间隔进行排序。[a, b],如果为most_recent_placed < a,则将一个点置于b,并将most_recent_placed设置为most_recent_placed < a这个解A是最优的证明是归纳地建立,对于任何有效解B和任何点x,B放置的坐标小于x的点的数量至少与x的A左侧放置的点的数量一样大。
发布于 2018-09-02 23:15:05
这个问题需要一个带有代码的答案。下面是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)https://stackoverflow.com/questions/4962015
复制相似问题