题目二:会场安排问题
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法来进行安排。试编程实现对于给定的k个待安排活动,计算使用的最少会场。输入数据中,第一行是k的值,接下来的k行中,每行有2个正整数,分别表示k个待安排活动的开始时间和结束时间,时间以0点开始的分钟计。输出为最少的会场数。
输入数据示例
5
1 23
12 28
25 35
27 80
36 50
输出数据
3
import java.util.Scanner;
public class HuiChangManager {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int j = scanner.nextInt(); // 活动个数
int[] start = new int[j]; // 开始时间
int[] end = new int[j]; // 结束时间
int[] meets = new int[j]; // 会场安排
for (int i = 0; i < j; i++) {
start[i] = scanner.nextInt();
end[i] = scanner.nextInt();
}
/*对活动的开始时间由小到大进行重排*/
for (int i = j - 1; i > 0; i--) {
for (int k = 0; k < i; k++) {
if (start[k] > start[k + 1]) {
int starttemp = start[k]; //开始时间顺序调整
start[k] = start[k + 1];
start[k + 1] = starttemp;
int endtemp = end[k]; //结束时间随开始时间进行调整
end[k]=end[k+1];
end[k+1]=endtemp;
}
}
}
/*会场安排*/
for (int i = 0; i < j; i++) { // i 遍历每个活动的开始时间
for (int k = 0; k < j; k++) { // j遍历每个会场活动的结束时间
if (start[i] > meets[k]) {
meets[k] = end[i]; // 会场活动结束时间重新赋值
break;
}
}
}
/*得到会场个数*/
int count = 0;
for (int i = 0; i < j; i++) {
if (meets[i] != 0) {
count++;
}
}
System.out.println("所需会场个数: "+count);
}
}
}