问题描述
强大的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表示范围内
思路:
1. 利用结构体存储左右区间,将每个区间按右端点排序
2.将最小的右端点和下一个区间的左端点比较,若左端点小于右端点,说明两区间重合,只要在该右端点记一个人即可
3.若左端点大于右端点,说明两区间未重合,需要再记一个人,并且更新最小右端点为该区间的右端点
4.遍历所有区间
代码:
#include<bits/stdc++.h>
using namespace std;
int n;//n个区间
struct node{
int L;
int R;
}var[1000]; //1000个节点 初始化
int ans; //人数
bool cmp(node a,node b){ //重写比较器
if(a.R<b.R||(a.R==b.R&&a.L<b.L))
{
return 1;
}
return 0;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>var[i].L>>var[i].R;
}
sort(var,var+n,cmp); //排序,1.右端点从小到大,相同则左端点从小到大
for(int i=0;i<n;)
{
//2.此时最小的右端点区间必有一人
ans++;
//记录2中的右端点
int temp=var[i].R;
//3.向后遍历。直至左端点大于2中的右端点,则有新人出现。重复2,3步骤直至结束
while(var[++i].L<=temp);
// while(1){
// if(var[i].l>temp)
// {
// break;
// }
// i++;
// }
}
cout<<ans<<endl;
return 0;
}