JAVA实现活动安排

8、实验七活动安排

实验内容

设有n个活动的集合E={1, 2, … n}, 其中每个活动都要求使用同一资源且在同一时间内只有一个活动能使用这一资源。要求根据下述两种贪心准则,给出活动集合中最大的相容活动子集合。

(1)使用“将结束时间早的活动尽量先排”作为贪心准则。
(2)使用“将最少占用时间的活动尽量先排”作为贪心准则。

解题思路

将活动按照结束时间进行从小到大排序。然后用i代表第i个活动,s[i]代表第i个活动开始时间,f[i]代表第i个活动的结束时间。按照从小到大排序,挑选出结束时间尽量早的活动,并且满足后一个活动的起始时间晚于前一个活动的结束时间,全部找出这些活动就是最大的相容活动子集合。事实上系统一次检查活动i是否与当前已选择的所有活动相容。若相容活动i加入已选择活动的集合中,否则,不选择活动i,而继续下一活动与集合A中活动的相容性。若活动i与之相容,则i成为最近加入集合A的活动,并取代活动j的位置。

源代码

package g活动安排问题;

import java.util.Scanner;

/**
 * @author Draco
 * @see "将结束时间早的活动尽量先排"作为贪心准则
 * @version 1.0
 * @date-time 2020-06-01 - 下午12:19:16
 */
public class Plan {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入活动的个数:");
		int num = scanner.nextInt();
		// 创建开始数组和结束数组
		int[] start = new int[num];
		int[] end = new int[num];
		System.out.println("请分别输入开始时间s[i]和结束时间f[i]:");
		for (int i = 0; i < num; i++) {
			System.out.println();
			System.out.print("s[" + (i + 1) + "]=");
			int begin = scanner.nextInt();
			System.out.print("f[" + (i + 1) + "]=");
			int end1 = scanner.nextInt();
			start[i] = begin;
			end[i] = end1;
		}

		// 创建一个数组存储是否安排活动
		boolean[] arrange = new boolean[num + 1];
		// 遍历数组,判断那些需要安排,安排的规则是按照顺序,没有相交的部分就安排
		arrange[0] = true;
		for (int i = 1, j = 0; i < start.length; i++) {
			// 如果前一个的结束时间比后一个的开始时间小。则安排下去
			if (end[j] < start[i]) {// 符合要求
				arrange[i] = true;
				j = i;// 如果成立,则j就是下一个作为参考的时间
			} else {
				arrange[i] = false;
			}
		}
		System.out.println();
		System.out.println("按结束时间非递减顺序排列如下:");
		System.out.println("序号\t开始时间\t结束时间");
		System.out.println("--------------------");

		int[] Index = new int[end.length];
		Index = Plan.Arraysort(end);

		for (int i = 0; i < num; i++) {
			System.out.print((i + 1) + "\t");
			// 对应下标
			System.out.print(start[Index[i]] + "\t");
			System.out.println(end[i]);
		}
		System.out.println("--------------------");

		System.out.println("安排的活动序号依次是:");
		for (int i = 0; i < arrange.length; i++) {
			if (arrange[i] == true) {
				System.out.println((i + 1));
			}
		}
	}

	public static int[] Arraysort(int[] arr) {
		int temp;
		int index;
		int k = arr.length;
		int[] Index = new int[k];
		for (int i = 0; i < k; i++) {
			Index[i] = i;
		}

		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j] > arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;

					index = Index[j];
					Index[j] = Index[j + 1];
					Index[j + 1] = index;
				}
			}
		}
		return Index;
	}
}
package g活动安排问题;

import java.util.Scanner;

/**
 * @author Draco
 * @see "将最少占用时间的活动尽量先排"作为贪心准则
 * @version 1.0
 * @date-time 2020-06-01 - 下午12:22:46
 */
public class Plan1 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.print("请输入活动的个数:");
		int num = scanner.nextInt();
		// 创建开始数组和结束数组
		int[] start = new int[num];
		int[] end = new int[num];
		System.out.println("请分别输入开始时间s[i]和结束时间f[i]:");
		for (int i = 0; i < num; i++) {
			System.out.println();
			System.out.print("s[" + (i + 1) + "]=");
			int begin = scanner.nextInt();
			System.out.print("f[" + (i + 1) + "]=");
			int end1 = scanner.nextInt();
			start[i] = begin;
			end[i] = end1;
		}

		// 创建一个数组存储是否安排活动
		boolean[] arrange = new boolean[num + 1];
		// 创建一个数组存储活动所需的时间
		int[] spend = new int[num];
		// 给时间数组赋值
		for (int i = 0; i < num; i++) {
			spend[i] = end[i] - start[i];
		}

		System.out.println();
		System.out.println("按活动所需时间非递减顺序排列如下:");
		System.out.println("序号\t开始时间\t结束时间\t活动所需时间");
		System.out.println("---------------------------");

		int[] Index = new int[spend.length];
		Index = Plan1.Arraysort(spend);

		for (int i = 0; i < num; i++) {
			System.out.print((i + 1) + "\t");
			// 对应下标
			System.out.print(start[Index[i]] + "\t");
			System.out.print(end[Index[i]] + "\t");
			System.out.println(spend[i]);
		}
		System.out.println("---------------------------");

		// 遍历数组,判断那些需要安排
		arrange[0] = true;
		for (int i = 1, j = 0; i < start.length; i++) {
			// 如果前一个的结束时间比后一个的开始时间小。则安排下去
			if (end[j] < start[Index[i]]) {// 符合要求
				arrange[i] = true;
				j = i;// 如果成立,则j就是下一个作为参考的时间
			} else {
				arrange[i] = false;
			}
		}

		System.out.println("安排的活动序号依次是:");
		for (int i = 0; i < arrange.length; i++) {
			if (arrange[i] == true) {
				System.out.println((i + 1));
			}
		}
	}

	public static int[] Arraysort(int[] arr) {
		int temp;
		int index;
		int k = arr.length;
		int[] Index = new int[k];
		for (int i = 0; i < k; i++) {
			Index[i] = i;
		}

		for (int i = 0; i < arr.length; i++) {
			for (int j = 0; j < arr.length - i - 1; j++) {
				if (arr[j] > arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;

					index = Index[j];
					Index[j] = Index[j + 1];
					Index[j + 1] = index;
				}
			}
		}
		return Index;
	}
}

运行截图

1、“将结束时间早的活动尽量先排”作为贪心准则

在这里插入图片描述

2、“将最少占用时间的活动先排”作为贪心准则

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章