给一个任务集合,包括任务的名称ID,任务的截止时间deadline,任务的收益profit。设定每个任务的执行时间为一个单位时间,求怎么调度任务,才能获得最大的收益?
例如:
1.示例1
输入: 如下四个任务 任务ID Deadline Profit a 4 20 b 1 10 c 1 40 d 1 30 输出: 任务的最大收益序列 : c, a
2.示例2
输入: 如下五个任务 任务ID Deadline Profit a 2 100 b 1 19 c 2 27 d 1 25 e 3 15 输出: 任务的最大收益序列: c, a, e
3.思路:
1.根据任务的收益倒序排列任务,这时任务是按照收益从高到低排列的;
2.建立两个辅助数组,一个用来装结果,一个用来标记任务是否已经在结果集中;
3.遍历排序后的数组,以deadline和数组大小n 中的较小值 减一 为数组下标,记录任务,并置标记数组为true;
4.遍历标记数组,为true的下标i, 输出结果数组result[i]即可;
5.时间复杂度为n^2,空间复杂度为n
/**
* @author fengyurong
* @date 2020-04-30 10:44
*/
//最大收益 工作调度
public class JobSchedualing {
@AllArgsConstructor
public static class Job {
char id;
int deadline;
int profit;
}
public static void printJobScheduling(Job arr[], int n) {
char[] result = new char[arr.length];
boolean[] flags = new boolean[arr.length];
Arrays.sort(arr,(job1,job2)-> Integer.compare(job2.profit, job1.profit));
for (int i = 0; i < arr.length; i++) {
for(int j = Math.min(arr[i].deadline,n) - 1;j>=0;j--) {
if(!flags[j]) {
result[j] = arr[i].id;
flags[j] = true;
break;
}
}
}
for (int i = 0; i < flags.length; i++) {
if(flags[i]) {
System.out.println(result[i]);
}
}
}
public static void main(String[] args) {
Job[] arr = { new Job('a', 10, 100), new Job('b', 1, 19),new Job('c', 2, 27),
new Job('d', 1, 25), new Job('e', 3, 15)};
printJobScheduling(arr,arr.length);
}
}