链接:https://www.nowcoder.com/questionTerminal/46e837a4ea9144f5ad2021658cb54c4d
来源:牛客网
题目描述
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。
输出描述:
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
示例1
输入
复制
3 3
1 100
10 1000
1000000000 1001
9 10 1000000000
输出
复制
100
1000
1001
大思路:定义一个Job类,再定义一个比较器,先按难度从低到高排列,难度相同的,由报酬从高到底排列。然后排序输入的job数组,难度不同的,去掉报酬低难度高的元素;难度相同的,去掉报酬低的工作,把这些元素都加到TreeMap里面。最后再用小伙伴数组每次查TreeMap的floorKey,如果为null,则不能找到工作,返回0;如果不为null,获取key对应的value就是最高报酬。
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
//Job类
static class Job {
int hard;
int money;
public Job(int hard, int money) {
this.hard = hard;
this.money = money;
}
}
//Job比较器,先按难度从低到高排列,难度相同的,由报酬从高到底排列
public static class JobComparator implements Comparator<Job> {
public int compare(Job job1, Job job2) {
return (job1.hard != job2.hard) ? (job1.hard - job2.hard) : (job2.money - job1.money);
}
}
public static void process(Job[] job, int[] friends) {
if (job.length < 1 || friends.length < 1) {
return;
}
//排序job数组,难度不同的,去掉报酬低难度高的元素;难度相同的,去掉报酬低的工作,把这些元素都加到TreeMap里面
Arrays.sort(job, new JobComparator());
TreeMap<Integer, Integer> map = new TreeMap<>();
map.put(job[0].hard, job[0].money);
Job pre = job[0];
for (int i = 1; i < job.length; ++i) {
if (job[i].hard != pre.hard && job[i].money > pre.money) {
pre = job[i];
map.put(job[i].hard, job[i].money);
}
}
// 小伙伴数组每次查TreeMap的floorKey,如果为null,则不能找到工作,返回0;如果不为null,获取key对应的value就是最高报酬
for (int i = 0; i < friends.length; ++i) {
if (map.floorKey(friends[i]) == null) {
System.out.println(0 + " ");
} else {
System.out.println(map.get(map.floorKey(friends[i])) + " ");
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
Job[] jobs = new Job[n];
for (int i = 0; i < n; ++i) {
int hard = sc.nextInt();
int money = sc.nextInt();
jobs[i] = new Job(hard, money);
}
int[] friends = new int[m];
for (int i = 0; i < m; ++i) {
friends[i] = sc.nextInt();
}
//调用主方法
process(jobs, friends);
}
}