题目描述
现在各大 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)