题目:
链接:https://www.nowcoder.com/questionTerminal/5e1b251c90ba4e6982cb349076ed4449
来源:牛客网
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
输入描述:
每个输入包含一个测试用例。 每个测试用例的第一行包含两个正整数,分别表示工作的数量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
解题思路:
用工作的等级信息构建一个二叉搜索树,在添加树节点的过程中,根据工作等级的比较更新节点的工作薪酬。
代码实现:
感觉牛客网上这道题的有些测试样例有点问题啊,数量有点不大对还是什么的。
import java.util.*; public class NuNuFindingJob { private BSTEntry<Integer,Integer> root; public static void main(String[] args) { // 初始化 Scanner scanner = new Scanner(System.in); NuNuFindingJob job = new NuNuFindingJob(); // 处理输入值 int N = scanner.nextInt(); int M = scanner.nextInt(); // 创建搜索树 for (int i = 0; i < N; i ++) { job.put(scanner.nextInt(), scanner.nextInt()); } // job.levelPrint(); for (int i = 0; i < M; i ++) { System.out.println(job.getPayment(scanner.nextInt())); } } private void put(int key, int value) { if (root == null) { root = new BSTEntry<Integer, Integer>(key, value); return; } BSTEntry<Integer,Integer> p = root; while (p != null) { if (p.key > key) { p.value = Integer.max(p.value, value); if (p.left == null) { p.left = new BSTEntry<Integer, Integer>(key, value); break; } else { p = p.left; } } else if (p.key == key) { p.value = Integer.max(p.value, value); break; } else { value = Integer.max(p.value, value); if (p.right == null) { p.right = new BSTEntry<Integer, Integer>(key, value); break; } else { p = p.right; } } } } private void levelPrint() { Queue<BSTEntry<Integer,Integer>> queue = new LinkedList<BSTEntry<Integer,Integer>>(); if (root != null) queue.offer(root); while (!queue.isEmpty()) { for (int i = queue.size() - 1; i >= 0; i--) { BSTEntry<Integer,Integer> p = queue.poll(); if (p.left != null) queue.offer(p.left); if (p.right != null) queue.offer(p.right); System.out.print(p.toString() + " "); } System.out.println(""); } } private BSTEntry<Integer, Integer> getEntry(int key) { if (root == null) return null; BSTEntry<Integer, Integer> entry = null; BSTEntry<Integer, Integer> p = root; while (p != null) { if (p.key > key) { p = p.left; } else if (p.key == key) { entry = p; break; } else { entry = p; p = p.right; } } return entry; } private int getPayment(int key) { BSTEntry<Integer, Integer> entry = getEntry(key); return entry == null ? 0 : entry.value; } private class BSTEntry<K,V> implements Map.Entry<K,V> { public K key; public V value; public BSTEntry<K,V> left; public BSTEntry<K,V> right; public BSTEntry(K key, V value) { this.key = key; this.value = value; } @Override public K getKey() { return key; } @Override public V getValue() { return value; } @Override public V setValue(V value) { return this.value = value; } @Override public String toString() { return "BSTEntry{" + "key=" + key + ", value=" + value + '}'; } } }