AcWing906.区间分组
题目详情
知识点
区间贪心
还是按照某端点值进行排序
从提出算法->验证算法有效性
思路
做法:
-
将所有区间按照左端点从小到大进行排序
-
从前往后处理每个区间
-
判断能否将其放进某个现有的组中,L[i] <= max_r
如果不存在这样的组:开一个新组,然后把当前区间放进去
如果存在这样的组,那么就把当前区间放到这个组里,并且更新当前组的max_r
-
判断的时候:只要判断当前结点的左端点是否大于判定组对应的右端点最大值即可(因为我们已经排序了,所以组内对应的左端点一定小于当前判定区间的左端点),所以不可能存在以下这种情况
不会出现上述情况,因为粉色区间肯定在第二个蓝色区间之前插入
证明
还是按照之前的思路:①ans<=cnt;②ans>=cnt.
ans为最终的答案,cnt是按照这样的算法得到的组的数量
- 首先,按照这个算法得到的方案一定是一个合法的方案,因为每一个组内的任何区间都没有交集,ans是所有合法方案中最小的:①ans<=cnt
- 找一个特殊的时刻:对cnt组,我们假设已经找到了cnt-1个组,目前正在看一个新的区间,此时我们发现当前区间与之前所有区间都有交集,所以我们要开一个新的组。对上述画横线的这个时刻,
- 由上图可知,前cnt个区间的交集不为空,有arr[i][0]
这个公共点,所以对于这些区间不管我们怎么分,它们都应该在不同的组里,所以②ans>=cnt
因此ans=cnt
超时代码
n = int(input())
arr = []
for i in range(n):
l,r = map(int,input().split())
arr.append([l,r])
arr.sort(key=lambda x:x[0])
res = 0
max_r = [0 for i in range(n+1)]
for i in range(n):
flag = 0
for j in range(res):
if arr[i][0] > max_r[j]:
flag = 1
max_r[j] = max(max_r[j],arr[i][1])
max_r[:res+1].sort()
break
if flag == 0:
max_r[res] = arr[i][1]
max_r[:res+1].sort()
res += 1
print(res)
使用优先队列之后!
import queue
n = int(input())
arr = []
for i in range(n):
l,r = map(int,input().split())
arr.append([l,r])
arr.sort(key=lambda x:x[0])
max_r = queue.PriorityQueue()
for i in range(n):
if max_r.empty():
max_r.put(arr[i][1])
continue
tmp = max_r.get()
if arr[i][0] > tmp:
max_r.put(arr[i][1])
else:
max_r.put(tmp)
max_r.put(arr[i][1])
print(max_r.qsize())
优先队列的用法
import queue
q = queue.PriorityQueue()
# 放入元素,第一个值越小优先级越高
q.put((2,"XiaoLi"))
q.put((1,"XiaoLi"))
q.put((0,"XiaoLi"))
# 查询长度 qsize()
print("长度为:",q.qsize())
# 是否为空
while not q.empty():
# 获取元素
print(q.get())
OUTPUT
本文作者:JaineCC
本文链接:https://www.cnblogs.com/JaineCC/p/17425765.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步