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 + "]";
            }       
        }
    
  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/Spground/p/9567894.html
Copyright © 2011-2022 走看看