- 问题描述:
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场,设计一个有效的贪心算法进行安排。
- 算法设计:
对于给定的k个待安排的活动,计算使用最少的会场时间表。
- 数据输入:
由文件input.txt给出输入数据。第一行有1个正整数k,表示有个待安排的活动,接下来的k行中,每行有2个正整数,分别表示k个待安的活动的开始时间和结束时间、时间以0点开始用分钟记录。
- 输入文本示例:
5
1 23
12 28
25 35
27 80
36 50
输出示例:3
- 解法二:混合排序
eg:
1 12 23 25 27 28 35 36 50 80
s s f s s f f s f f
1 2 1 2 3 2 1 2 1 0
import java.util.Scanner;
public class pj2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int num = -1;
int geshu = 0;
num = input.nextInt();// 输入待安排的活动个数
// System.out.println("总个数:"+ num);
int[] s = new int[num];
int[] f = new int[num];
for (int i = 0; i < num; i++) {
s[i] = input.nextInt();
f[i] = input.nextInt();
}
// // 打印刚才输入的值
// for (int i = 0; i < num; i++) {
// System.out.print(s[i] + " ");
// System.out.println(f[i]);
// }
int[] time = new int[2 * num];// 用来存储所以的时间
char[] tip = new char[2 * num];// 用来存储这个时间对应得状态
for (int i = 0; i < num; i++) {
time[i] = s[i];
tip[i] = 's';
}
for (int i = num; i < time.length; i++) {
time[i] = f[i - num];
tip[i] = 'f';
}
// for (int i = 0; i < time.length; i++) {
// System.out.print(time[i] + " ");
//
// }
//
// 排序
for (int i = 0; i < time.length; i++) {
int temp1 = 0;
char temp2 = ' ';
for (int j = i+1; j < time.length; j++) {
if (time[i] > time[j]) {
temp1 = time[i];
time[i] = time[j];
time[j] = temp1;
temp2 = tip[i];
tip[i] = tip[j];
tip[j] = temp2;
}
}
}
int c = 0;
int max = 0;
for (int i = 0; i < tip.length; i++) {
if(tip[i] == 's') {
c++;
}else {
c--;
}
if(c > max) {
max = c;
}
}
System.out.println("至少安排的会场个数:" + max);
}
}