题目
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法来进行安排。试编程实现对于给定的 k 个待安排活动,计算使用的最少会场。
输入数据中,第一行是 k 的值,接下来的 k 行中,每行有 2 个正整数,分别表示 k 个待安排活动的开始时间和结束时间,时间以 0 点开始的分钟计。
输出为最少的会场数。
输入样例
5
1 23
12 28
25 35
27 80
36 50
输出样例
3
分析
简单的贪心,先根据会议开始时间对所有会议进行升序排列,再遍历会议集合一个个的安排会场。
如果会议开始的时候没有空会场,就新开辟一个新会场。
如果会议开始的时候有空会场,就重复利用。
public static int arrange(int length, int[][] meetings) {
Arrays.sort(meetings, Comparator.comparingInt(meeting -> meeting[0]));
List<Integer> times = new ArrayList<>();// 记录会议结束时间
outer:
for (int i = 0; i < length; i++) {
int start = meetings[i][0];
int end = meetings[i][1];
for (int j = 0; j < times.size(); j++) {
if (start >= times.get(j)) {
times.set(j, end);// 找到空会场,更换成新的结束时间
continue outer;// 会议 meetings[i] 安排好了
}
}
times.add(end);// 没有找到可用会场,需要新会场
}
return times.size();
}
// 测试
public static void main(String[] args) {
int length = 5;
int[][] meetings = {
{1, 23},
{12, 28},
{25, 35},
{27, 80},
{36, 50}
};
int count = arrange(length, meetings);
System.out.println(count);
}