问题描述
强大的kAc建立了强大的帝国,但人民深受其学霸及23文化的压迫,于是勇敢的鹏决心反抗。
kAc帝国防守森严,鹏带领着小伙伴们躲在城外的草堆叶子中,称为叶子鹏。
kAc帝国的派出的n个看守员都发现了这一问题,第i个人会告诉你在第li个草堆到第ri个草堆里面有人,要求你计算所有草堆中最少的人数,以商议应对。
“你为什么这么厉害”,得到过kAc衷心赞美的你必将全力以赴。
输入格式
第一行一个数字n,接下来2到n+1行,每行两个数li和ri,如题。
输出格式
输出一个数,表示最少人数。
样例输入
5
2 4
1 3
5 7
1 8
8 8
样例输出
3
数据规模和约定
30%的数据n<=10
70%的数据n<=100
100%的数据n<=1000
所有数字均在int表示范围内
算法分享:
其实就是寻找各个区间的不重复(no_chongfu)个数:
代码如下:
# 藏匿的刺客,贪心,计算最小的值
n = int(input())
chongfu = [] # 把输入的区间暂时存起来
for i in range(n):
l,r = map(int,input().split())
chongfu.append([l,r])
chongfu.sort(key=lambda x:(x[1],x[0])) # 按照每个区间的末尾从小到大排序
no_chongfu = [] # 开始计算,申明一个不重复的列表用于存储
# 首先加入第一个
no_chongfu.append(chongfu[0])
right = no_chongfu[-1][-1] # 右边的标记
for i in range(1,len(chongfu)):
left = chongfu[i][0] # 没有加进来的左边
if left < right:
if left>no_chongfu[-1][0]:
no_chongfu.remove(no_chongfu[-1])
no_chongfu.append([left,right]) # 加入新列表
# 做新的标记
right = no_chongfu[-1][-1]
else: # 如果left还小于比较对象的left
new_right = no_chongfu[-1][0]
no_chongfu.remove(no_chongfu[-1])
no_chongfu.append([new_right, right]) # 加入新列表
# 做新的标记
right = no_chongfu[-1][-1]
else:
no_chongfu.append(chongfu[i])
right = no_chongfu[-1][-1]
print(len(no_chongfu)) # 输出他的个数len