P2434 [SDOI2005]区间python实现

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值