题目:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法来进行安排。试编程实现对于给定的 k 个待安排活动,计算使用的最少会场。
输入数据中,第一行是 k 的值,接下来的 k 行中,每行有 2 个正整数,分别表示 k 个待安排活动的开始时间和结束时间,时间以 0 点开始的分钟计。
输出为最少的会场数。
3
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
// 数据交换
static void swap(int[][] meets, int i, int j) {
// i==j的可能性似乎不存在
if (i == j) {
return;
}
int temp1 = meets[i][0];
meets[i][0] = meets[j][0];
meets[j][0] = temp1;
int temp2 = meets[i][1];
meets[i][1] = meets[j][1];
meets[j][1] = temp2;
}
// 快速排序
static void sort(int[][] meets, int start, int end) {
if (start >= end) {
return;
}
// 以起始点索引为分界点
int key = meets[start][0];
int i = start + 1;
int j = end;
while (true) {
while (i <= end && meets[i][0] < key) {
i++;
}
while (j > start && meets[j][1] > key) {
j--;
}
if (i < j) {
swap(meets, i, j);
} else {
break;
}
}
// 交换j和分界点的值
swap(meets, start, j);
// 递归
sort(meets, start, j - 1);
sort(meets, j + 1, end);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
int n = scanner.nextInt();
int[][] meets = new int[n][2];
for (int i = 0; i < n; i++) {
meets[i][0] = scanner.nextInt();
meets[i][1] = scanner.nextInt();
}
sort(meets, 0, n - 1);
List<Integer> list = new ArrayList<>();
int count = 0;// 需要会场数
for (int i = 0; i < n; i++) {
boolean flag = true;
for (int j = 0; j < list.size(); j++) {
if (meets[i][0] > list.get(j)) {
list.set(j, meets[i][1]);
flag = false;
break;
}
}
// 增加会场
if (flag) {
list.add(meets[i][1]);
count++;
}
}
System.out.println(count);
}
scanner.close();
}
}原文地址:http://blog.csdn.net/u011506951/article/details/34935757