每天一道算法题17

每种工作有难度和报酬,规定如下:
class Job {
public int money;
public int hard;
}

给定一个Job类型的数据jobarr,表示所有岗位,每个岗位的都可以提供任意份工作,选工作的标准是在难度不超过自身 能力值的情况下,
选择报酬最高的岗位,给定一个int类型的数组arr,表示所有人的能力,返回int类型的数组,表示每个人按照标准选工作后所能获得的最高报酬
解答:这个问题要进行两次排序,首先按照难度排序,然后相同难度下,按照报酬从大到小排序。
然后根据能力,选择<=hard的最高报酬。然后只保留难度相同的最大报酬的,以及难度增加,但是报酬没有增加的选项。

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

class MyComparator implements Comparator {

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

public static int[] f1(Job[] jobs, int[] ablities) {
    Arrays.sort(jobs, new MyComparator());

    int[] res = new int[ablities.length];
    TreeMap map = new TreeMap<>();
    map.put(jobs[0].hard, jobs[0].money);
    Job pre = jobs[0];
    for (int i = 0; i < jobs.length; i++) {
        if (jobs[i].hard != pre.hard && jobs[i].money > pre.money) {
            pre = jobs[i];
            map.put(jobs[i].hard, jobs[i].money);
        }
    }

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

    return res;
}

你可能感兴趣的:(每天一道算法题17)