问题
资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
强大的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表示范围内
思路来源:
https://blog.csdn.net/shaonao123/article/details/125105767
c++的代码
附Java代码
import java.util.*;
class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
if(n == 0 || n == 1){
System.out.println(n);
return;
}
List<int[]> list = new LinkedList<>();
for(int i = 0; i < n; i++){
int l = sc.nextInt();
int r = sc.nextInt();
list.add(new int[]{l, r});
}
//按左端点升序排,如果左端点相同,按右端点升序排
list.sort((e1, e2) -> e1[0] == e2[0] ? e1[1] - e2[1] : e1[0] - e2[0]);
int[] cur = list.get(0);
int cnt = 0;
for(int i = 1; i < list.size(); i++){
int[] next = list.get(i);
if(next[0] >= cur[0] && cur[1] >= next[1]){ //cur区间 包含next区间
cur = next;
}else if(next[0] < cur[1]){ //相交
cur = new int[]{next[0], cur[1]};
}else{ //不相交
cur = next;
cnt++; //cur区间至少加一个敌人
}
//next区间 包含 cur区间 并不需要更新cur区间
}
//最后cur区间也要有一个敌人
System.out.println(cnt + 1);
}
}