- 问题描述:
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场,设计一个有效的贪心算法进行安排。
- 算法设计:
对于给定的k个待安排的活动,计算使用最少的会场时间表。
- 数据输入:
由文件input.txt给出输入数据。第一行有1个正整数k,表示有k个待安排的活动,接下来的k行中,每行有
2个正整数,分别表示k个待安排的活动的开始时间和结束时间、时间以0点开始用分钟记录。
- 输入文本示例:
5
1 23
12 28
25 35
27 80
36 50
输出示例:3
- 解法一:循环安排(贪心算法)
会场号 初始状态 结束时间
会场1号:0 23-35-50
会场2号:0 28
会场3号:0 80
会场4号:0
会场5号:0
import java.util.Scanner;
public class pj1 {
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]);
// }
// 按照演出开始时间排序
for (int i = 0; i < s.length; i++) {
int temp1 = 0;
int temp2 = 0;
for(int j = i+1; j < s.length; j++) {
if (s[i] > s[j]) {
temp1 = s[i];
s[i] = s[j];
s[j] = temp1;
temp2 = f[i];
f[i] = f[j];
f[j] = temp2;
}
}
}
// 双重循环得到安排的会场
int[] anpai = new int[num];
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
if (anpai[j] < s[i]) {
anpai[j] = f[i];
break;
}
}
}
// 遍历安排的数值,找出被安排的个数
for (int i = 0; i < num; i++) {
if (anpai[i] != 0) {
geshu++;
}
}
System.out.println("至少安排的会场个数:"+geshu);
}
}