问题描述
强大的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
样例输入
5
117590 173621
45060 118812
71296 101768
89958 174054
38588 89652
样例输出
2
数据规模和约定
30%的数据n<=10
70%的数据n<=100
100%的数据n<=1000
所有数字均在int表示范围内
思路:
- 实际上是求n个看守员发现有人区间的所有交集的个数,即对所有区间求交集,交集的个数即为所求的人数。
- 先按 ri 排序(升序),取最小的 r0 为 minr,在 length(列表)中添加 minr,删除 haystacks(集合) 中包含 minr 的区间,然后循环再取新的 minr,一直删到 haystacks 中没有元素(haystacks.size() == 0)。然后 length 的长度就是所求的最少人数。
-
先从 ri 最小的那个看守员说的区间开始往后遍历。
-
只要这个看守员说的 ri 在后一个看守员说的区间(li和ri)之间,那么后一个看守员说的区间就可以删除,因为后一个看守员说的区间一定和最小 ri 的那个看守员说的区间重合了(即区间之间有交集则人数加一)。遍历到最后这个最小 ri 的那个看守员说的区间也会被删除。
-
然后从剩下的最小 ri 的那个看守员说的区间开始往后遍历。
代码如下:
import java.util.*;
public class Main {
/**
* 内部类 ——> 草堆
* l ——> 左边界
* r ——> 右边界
*/
public static class Haystack {
public int l;
public int r;
public Haystack(int l, int r) {
this.l = l;
this.r = r;
}
public int getR() {
return r;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//n个看守员
int n = sc.nextInt();
//草堆集合
List<Haystack> haystacks = new ArrayList<>();
int l, r;
for (int i = 0; i < n; i++) {
l = sc.nextInt();
r = sc.nextInt();
haystacks.add(new Haystack(l, r));
}
//按 ri 排序(升序)
haystacks.sort(Comparator.comparing(Haystack::getR));
//记录 n 个区间的交集
List<Object> length = new ArrayList<>();
int minr, k;
while (haystacks.size() != 0) {
Haystack haystack = haystacks.get(0);
minr = haystack.r;
length.add(minr);
k = 0;
l = haystack.l;
while (minr >= l) {
k += 1;
if (k < haystacks.size()) {
l = haystacks.get(k).l;
} else {
minr = -1;
}
}
//因为要删除haystacks里面的多个值,所以会涉及到一个问题,就是当你删除掉下标为1的元素,
//原来下标为2的元素会自动改变自己的下标为1,后面的元素依次把自己的下标值减一
//鉴于这种情况,我们想循环删除haystacks中的多个元素的话,就必须从后往前删,这样保障了你删除了一个元素之后,
//haystacks中元素的下标移动不会影响到那些需要删除但是还未删除到的元素
// if (k > 0) {
// haystacks.subList(0, k).clear();//subList() 方法用于截取并返回动态数组中的一部分。
// }代码等同for循环代码
for (int i = k - 1; i >= 0; i--) {
haystacks.remove(i);
}
}
System.out.println(length.size());
}
}