洛谷P1803 线段覆盖

题目描述

现在各大 oj 上有 nn 个比赛,每个比赛的开始、结束的时间点是知道的。

yyy 认为,参加越多的比赛,noip 就能考的越好(假的)。

所以,他想知道他最多能参加几个比赛。

由于 yyy 是蒟蒻,如果要参加一个比赛必须善始善终,而且不能同时参加 22 个及以上的比赛。

输入格式

第一行是一个整数 nn ,接下来 nn 行每行是 22 个整数 a_{i},b_{i}ai​,bi​ ( a_{i}<b_{i}ai​<bi​ ),表示比赛开始、结束的时间。

输出格式

一个整数最多参加的比赛数目。

这是一个贪心问题,还有可分割的贪心(背包),比较简单,排序就行了。

每一个比赛不能重叠,要找出能排下的最多的比赛数,要按照比赛时间升序排列。

为什么要按照结束时间升序排列?后面的比赛能不能参加取决于前面的比赛是否已经结束。如果只有三个比赛(图1 2 3)那么参加第二个比赛无疑是对后面的比赛影响最小,因为最先结束。可能会觉得参加第三个比赛,前面还有很多时间,不还可以参加其他比赛了?既然是按照结束时间升序排列,如果还有在比赛3开始之前结束的比赛4,那么就会把比赛四来跟1 2比较,3就不用考虑,所以当出现图中这种情况时在这三个比赛之前是没有其他比赛可参加的。

n = int(input())
lst = []
for i in range(n):
    lst.append(list(map(int,input().split())))
lst.sort(key=lambda x:x[1])    # 把所有的比赛按照结束的时间升序排列
ans = 0
time = 0        # 记录结束时间
for i in lst:
    if time == 0:      # 还没参加比赛
        time = lst[0][1]
        ans += 1
    else:              # 参加了比赛
        if i[0] >= time:      # 后面的比赛的开始时间大于之前参加的比赛的结束时间
            time = i[1]
            ans+=1
        else:
            continue
print(ans)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在北京挖石油的日子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值