涵盖所有范围的最小点数

时间:2018-09-02 13:30:20

标签: algorithm

我们给了n个范围,我们需要放置最小数量的点,以便每个范围中至少包含1个点。 我知道这个问题已经在这个网站上问过,但我正在尝试进一步优化它 下面是我的算法

1。首先,我将进行一些预处理,并为每个端点存储其起点。为了保持唯一性,我还将考虑索引。

2。接下来,我将初始化一个数组,该数组将存储我们需要标记的数字(这是我们的答案)。用[0]初始化

3。接下来,我将对所有端点进行排序并对其进行迭代。对于每个终点,我将检查其起点是否在最后一个标记点​​之前或之后

a。如果起始点在最后标记的点之前,则意味着与当前终点相对应的范围已经包含最后访问的地点,因此无需标记当前终点

b。如果取而代之的是起点(例如,最后标记的点为5,起点为7),则此范围尚未包含数字,我们将标记该点并将其插入数组。

现在,由于我们生成的数组已经排序,因此我们可以与数组的最后一个元素进行比较。我还照顾了上下限相同的范围。我分开计算了,不再考虑了

但是上述算法不起作用。

可能是什么问题 这是我的python 3代码。

from collections import defaultdict
d=defaultdict(lambda:0)

n=int(input())
a=[]
ranges=[]
for i in range(n):
    s,e=[int(i) for i in input().split()]
    ranges.append([s,e])
    d[(i,e)]=s
    a.extend([(s,i,'s'),(e,i,'e')])

final=[0]
ans=0
a.sort(key=lambda a:a[0])

for time,ind,type in a:
    if type=='e' and d[(ind,time)]==time:
        if final[-1]<time:
            final.append(time)
            ans+=1
    elif type=='e':
        if final[-1]<d[(ind,time)] and final[-1]<time:
            final.append(time)
            ans+=1

print(ans)
for e in final[1:]:
    print(e,end=' ')

0 个答案:

没有答案