题目:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法来进行安排。试编程实现对于给定的 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