zoukankan      html  css  js  c++  java
  • 网易2019实习生招聘编程第3题——牛牛找工作

    为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
    输入描述:
    每个输入包含一个测试用例。
    每个测试用例的第一行包含两个正整数,分别表示工作的数量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

    输出例子1:

    100 
    1000 
    1001

    基本思想就是:排序+二分查找

    
    public  static void  f3() {
            Scanner scan = new Scanner(System.in);
            int n = scan.nextInt(), m = scan.nextInt();//n工作数 , m小伙伴数量  
            List<Entry> data = new ArrayList<>();
            //读取数据
            for (int i = 0; i < n; i++) {
                int h = scan.nextInt(), p = scan.nextInt();
                data.add(new Entry(h, p));  
            }
    
            //自定义比较器 Comparator
            Comparator<Entry> cmp = new Comparator<Entry>() {
                @Override
                public int compare(Entry o1, Entry o2) {
                    // TODO Auto-generated method stub
                    return o1.hard - o2.hard;
                }
            };
    
            //排序数据
            Collections.sort(data, cmp);
    
            //更新maxHashMap <i, value> 表示0~i之间最大的薪酬value.
            Map<Integer, Integer> maxHashMap = new HashMap<>();
            for (int i = 0, max = Integer.MIN_VALUE; i < data.size(); i++) {
                Entry e = data.get(i);
                int p = e.money;
                if (max < p) {
                    maxHashMap.put(i, p);
                    max = p;
                } else {
                    maxHashMap.put(i, max);
                }   
            }
    
            //debug
            System.out.println("===");
            System.out.println(maxHashMap);
            System.out.println(data);
    
            //为每个小伙伴寻找最高的薪酬
            for (int i = 0; i < m; i++) {
                int ability = scan.nextInt();
                Entry e = new Entry(ability, -1);
                int index = Collections.binarySearch(data, e, cmp);
                if (index < 0) {//没找到 但是包含该entry的插入位置
                    index =  Math.abs(index + 1) - 1;//index的取值范围为-1~m-1                   
                } else {//找到对应的entry,但是需要找到最右边的entry对应的下标,以保证能得到最大的薪酬值。
                    int hard = data.get(index).hard;                
                    while (index < data.size() && data.get(index).hard == hard) index++;
                    index = index - 1;          
                }
                System.out.println(index == -1 ? 0 : maxHashMap.get(index));    
            }       
        }
    
        /**
         * 自定义 工作难度--薪酬 类
         */
        static class Entry {
            int hard,  money;       
            public Entry(int hard, int money) {
                super();
                this.hard = hard;
                this.money = money;
            }
    
            @Override
            public String toString() {
                // TODO Auto-generated method stub
                return "[" + hard + "," + money + "]";
            }       
        }
    
  • 相关阅读:
    WEB 前端菜鸟,感觉很迷茫,该怎么做?
    WEB前端研发工程师编程能力成长之路
    CSS3 基本要素概览
    初学者应该怎么学习前端?web前端的发展路线大剖析!
    【初学者必读】:前端工程师的知识体系
    观点 | 2017年前端初学者的生存指南
    零基础的前端开发初学者应如何系统地学习?
    Asp.net core Identity + identity server + angular 学习笔记 (第五篇)
    Asp.net core Identity + identity server + angular 学习笔记 (第四篇)
    Asp.net core Identity + identity server + angular 学习笔记 (第三篇)
  • 原文地址:https://www.cnblogs.com/Spground/p/9567894.html
Copyright © 2011-2022 走看看