/**
* 贪心算法_活动安排问题
* @author Matt
*/
public class GreedySelector {
/**
* 贪心选择
* @param s 开始时间
* @param f 结束时间
* @param a 是否安排布尔数组
* @return 已安排活动数
*/
public static int greedySelector(int []s, int []f, boolean []a) {
int n = s.length - 1; // 总活动数
a[1] = true; // 第一个活动设置安排
int j = 1; // 正在进行的活动索引坐标
int count = 1; // 已安排活动数量
for (int i = 2; i <= n; i++) { // 从第二个活动开始遍历
if (s[i] >= f[j]) { // 下个活动的开始时间>上一个活动的结束时间
a[i] = true; // 设置当前活动安排
j = i; // 跳转到当前活动
count++; // 活动数量加1
} else {
a[i] = false; // 如果不满足时间安排则不安排该活动
}
}
return count; // 返回已安排的活动数量
}
public static void main(String[] args) {
// 一共11个活动,下面两个数组分别为开始时间和结束时间
// 因为我们是从坐标为1开始遍历的,所以坐标为0没有活动时间为0
int []s = {0, 1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};
int []f = {0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
boolean []a = new boolean[12];
System.out.println("安排活动数:" + greedySelector(s, f, a));
System.out.println("安排情况:");
for (int i = 0; i < a.length-1; i++) {
if (i!=0 && i%4 == 0) System.out.println(); // 换行
System.out.print("(" + (i+1) + ", "+ a[i+1] + ")"); // 轨迹
}
}
}
// 运行结果:
// 安排活动数:4
// 安排情况:
// (1, true)(2, false)(3, false)(4, true)
// (5, false)(6, false)(7, false)(8, true)
// (9, false)(10, false)(11, true)
贪心算法_活动安排问题
最新推荐文章于 2020-10-05 12:57:43 发布