这里写自定义目录标题
P2434 [SDOI2005]区间python实现
题目
题目描述
现给定n个闭区间[ai, bi],1<=i<=n。这些区间的并可以表示为一些不相交的闭区间的并。你的任务就是在这些表示方式中找出包含最少区间的方案。你的输出应该按照区间的升序排列。这里如果说两个区间[a, b]和[c, d]是按照升序排列的,那么我们有a<=b<c<=d。
请写一个程序:
读入这些区间;
计算满足给定条件的不相交闭区间;
把这些区间按照升序输出。
输入格式
第一行包含一个整数n,3<=n<=50000,为区间的数目。以下n行为对区间的描述,第i行为对第i个区间的描述,为两个整数1<=ai<bi<=1000000,表示一个区间[ai, bi]。
输出格式
输出计算出来的不相交的区间。每一行都是对一个区间的描述,包括两个用空格分开的整数,为区间的上下界。你应该把区间按照升序排序。
输入输出样例
讲解
先把所有区间按起点排序,然后将最左边的区间的两端设为答案区间的两端。接下来从第一个开始查找剩下的区间,如果答案区间的右端小于当前查找到的区间的左端,输出区间,将此空间从剩余空间中删除。否则,更新答案区间右端,并将区间的左右值替换为当前查找区间的左右值
代码
n = int(input())
qujian = []
for i in range(n):
a, b = map(int, input().split())
qujian.append([a, b])
qujian = sorted(qujian)
while len(qujian) != 0:
left = qujian[0][0]
right = qujian[0][1]
qujian.pop(0)
cc = []
for i in qujian:
if i[0] <= right and i[1] >= right:
right = i[1]
cc.append(i)
elif i[1] <= right:
cc.append(i)
for i in cc:
qujian.remove(i)
print(left, right)