我们给了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=' ')