题目描述:
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?
输入
第一行一个正整数n (n <= 10000)代表活动的个数。
第二行到第(n + 1)行包含n个开始时间和结束时间。
开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
输出
一行包含一个整数表示最少教室的个数。
输入示例
3
1 2
3 4
2 9
输出示例
2
import java.util.Arrays;
import java.util.Scanner;
/**
* 策略: 按照开始时间排序优先安排活动,如果冲突,则加一个教室。
* 简单地理解一下,策略是这样,我们把活动按照开始时间有小到大的顺序排序。
* 假设目前已经分配了k个教室(显然k初始等于0),对于当前这个活动,
*(1) 如果它能安排在k个教室里的某一个,则把它安排在其中的任何一个教室里,k不变。
*(2) 否则它和每个教室里的活动都冲突,则增加一个教室,安排这个活动。
*/
public class ActivityPlan2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
Node[] nodes = new Node[n + 5];
for (int i = 0; i < n; i++) {
nodes[i] = new Node();
nodes[i].start = scanner.nextInt();
nodes[i].end = scanner.nextInt();
}
Arrays.sort(nodes, 0, n, (o1, o2) -> o1.start - o2.start);
int k = 0;
Node[] p = new Node[n + 5];
for (int i = 0; i < n; i++) {
Node node = nodes[i];
boolean flag = false;
if (k == 0) {
p[k++] = new Node(node);
continue;
}
for (int j = 0; j < k; j++) {
if (node.start >= p[j].end) {
flag = true;
p[j].start = node.start;
p[j].end = node.end;
break;
}
}
if (!flag)
p[k++] = new Node(node);
}
System.out.println(k);
}
private static class Node {
int start;
int end;
public Node(Node node) {
this.end = node.end;
this.start = node.start;
}
public Node() {
}
}
}