问题描述
每种工作有难度和报酬,规定如下
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+ " ");
}
}