任务调度-获取最大收益

给一个任务集合,包括任务的名称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);
    }
}

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值