每个人按照难度标准选工作后所能获得的最高报酬问题的解法

问题描述

每种工作有难度和报酬,规定如下
        class Job {
                public int money;// 该工作的报酬
                public int hard; // 该工作的难度
        }
        给定一个Job类型的数组jobarr,表示所有岗位,每个岗位都可以提供任意份工作选工作的标准是在难度不超过自身能力值的情况下,选择报酬最高的岗位给定一个int类型的数组arr,表示所有人的能力。返回int类型的数组,表示每个人按照标准选工作后所能获得的最高报酬。

思路

        先按照难度排序从小到大,难度相同的按照报酬从大到小进行排序。每个难度里面只选报酬最大的,组成一个数组,并且在新的数组中剔除如果难度增大了,但是报酬没有增大的job,此时的数组一定是相同难度下报酬最高的,且难度增大报酬必增大的数组。上面的思想可以通过大根堆来实现,接下来遍历个人能力数组,查找大根堆中最接近个人能力的难度,把所对应的报酬记录在结果数组中,即为所需的数组。

代码

    public static class Job{
        public int money;
        public int hard;

        public Job(int m,int h){
            money = m;
            hard = h;
        }
    }

    public static class MyHardC implements Comparator<Job>{

        @Override
        public int compare(Job o1, Job o2) {
            return o1.hard!=o2.hard?o1.hard-o2.hard:o2.money-o1.money;
        }
    }

    public static int[] maxSlary(Job[] job,int[] ables){
        if (job ==null|| job.length==0||ables==null||ables.length==0){
            return null;
        }
        Arrays.sort(job,new MyHardC());
        TreeMap<Integer,Integer> map = new TreeMap<>();
        Job preHard = job[0];
        map.put(preHard.hard, preHard.money);
        for (Job item:job){
            if (preHard.hard != item.hard && item.money > preHard.money){
                map.put(item.hard, item.money);
                preHard = item;
            }
        }

        int[] res = new int[ables.length];
        for (int i =0;i<ables.length;i++){
            if (map.floorKey(ables[i]) != null){
                res[i] = map.get(map.floorKey(ables[i]));
            }else {
                res[i] = 0;
            }
        }
        return res;
    }

    public static void main(String[] args) {

        Job[] jobs = new Job[]{new Job(1,2),new Job(1,3),new Job(2,2),new Job(2,4),new Job(3,5),new Job(5,3)};
        int[] ables = new int[]{1,1,2,3,4,5,6,7,8};
        int[] res = maxSlary(jobs, ables);

        for (int i : res){
            System.out.print(i+ " ");
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值