每天一道算法题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<Job> {

    @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<Integer, Integer> 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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容