每种工作有难度和报酬,规定如下:
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;
}