首页 > 代码库 > 会场安排问题
会场安排问题
会场安排问题
题目:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法来进行安排。试编程实现对于给定的 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(); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。