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