首页 > 代码库 > 会场安排问题

会场安排问题

会场安排问题

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


输入数据中,第一行是 k 的值,接下来的 k 行中,每行有 2 个正整数,分别表示 k 个待安排活动的开始时间和结束时间,时间以 0 点开始的分钟计。

输出为最少的会场数。


输入数据示例
5
1 23
12 28
25 35
27 80
36 50

输出数据

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();
	}
}