链接: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
解题思路:对于输入的工作难度和报酬均按升序排序,然后计算当前工作难度下,最多的报酬是多少。
package BiShiTi;
import java.util.*;
public class m_0020 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N = scan.nextInt();
int M = scan.nextInt();
int [][] dp = new int[N][2];
for (int i = 0; i < N; i++) {
int Di = scan.nextInt();
int Pi = scan.nextInt();
dp[i][0] = Di;
dp[i][1] = Pi;
}
Arrays.sort(dp, new Comparator<int[]>() {
// 第一列升序,第二列也是升序
public int compare(int [] o1, int [] o2) {
if (o1[0] == o2[0]) {
return o1[1] - o2[1];
}else{
return o1[0] - o2[0];
}
}
});
TreeMap<Integer, Integer> DP = new TreeMap<>();
DP.put(dp[0][0], dp[0][1]);
for (int i = 1; i < N; i++) {
int Di = dp[i][0];
int Pi = dp[i][1];
// 即便存在key相同的也不影响
int v = DP.lastEntry().getValue();
DP.put(Di, v>Pi?v:Pi);
}
for (int i = 0; i < M; i++) {
int Ai = scan.nextInt();
if (null == DP.floorKey(Ai)) {
System.out.println(0);
}else {
System.out.println(DP.get(DP.floorKey(Ai)));
}
}
}
}