算法题 - 不重叠线段 - Python

问题描述:

不重叠线段问题

在一个数轴上,有很多线段,对应着坐标轴上的两点ab,要获取任意两点线段都不重叠(端点是可以重叠)的情况下,最多可以选出多少段来? 其实和电视台排节目一个类型。

测试用例:
输入:

3  # 线段数,下面是各种线段(a, b)
6 3  # 特别注意,a 可能大于 b。估计是为了增加题目的复杂度吧哈
1 3
2 5

输出:

2

问题分析:

(1)先把数据整理一下,使a < b
(2)贪心思想解决,以 线段末尾点b为关键字,进行排序。
(3)以第一个线段为开始,如何后续的线段的开始点,大于等于 第一个线段的末尾点,则 计算器加一,并更新,新的末尾点。依次遍历结束。

Python3实现:

# @Time   :2018/09/15
# @Author :LiuYinxing
# 贪心思想,2018爱奇艺秋招


if __name__ == '__main__':

    n = int(input())  # 输入数据
    data = []
    for case in range(n):
        a, b = map(int, input().split())
        if a < b:
            data.append([a, b])
        else:
            data.append([b, a])

    data = sorted(data, key=lambda x: x[1])  # 排序

    cnt = 1
    tmp = data[0][1]
    for v in data:  # 扫描计算
        if tmp <= v[0]:
            cnt += 1
            tmp = v[1]
    print(cnt)  # 输出结果

声明: 总结学习,有问题可以批评指正,大神可以略过哦。

猜你喜欢

转载自blog.csdn.net/XX_123_1_RJ/article/details/82712652