牛客网系列--网易2019实习生招聘编程题--牛牛找工作

题目:

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

}

猜你喜欢

转载自blog.csdn.net/zhangzhetaojj/article/details/80691604