您的位置:首页 > 编程语言

【编程题m_0020】牛牛找工作 3ff8

2018-05-14 22:35 162 查看
链接: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
[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)));
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: