【编程题m_0020】牛牛找工作

链接: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)));
			}
		}
	}

}

猜你喜欢

转载自my.oschina.net/MasterLi161307040026/blog/1812493