網易2019實習生招聘編程第3題——牛牛找工做

爲了找到本身滿意的工做,牛牛收集了每種工做的難度和報酬。牛牛選工做的標準是在難度不超過自身能力值的狀況下,牛牛選擇報酬最高的工做。在牛牛選定了本身的工做後,牛牛的小夥伴們來找牛牛幫忙選工做,牛牛依然使用本身的標準來幫助小夥伴們。牛牛的小夥伴太多了,因而他只好把這個任務交給了你。
輸入描述:
每一個輸入包含一個測試用例。
每一個測試用例的第一行包含兩個正整數,分別表示工做的數量N(N<=100000)和小夥伴的數量M(M<=100000)。
接下來的N行每行包含兩個正整數,分別表示該項工做的難度Di(Di<=1000000000)和報酬Pi(Pi<=1000000000)。
接下來的一行包含M個正整數,分別表示M個小夥伴的能力值Ai(Ai<=1000000000)。
保證不存在兩項工做的報酬相同。java

輸出描述:
對於每一個小夥伴,在單獨的一行輸出一個正整數表示他能獲得的最高報酬。一個工做能夠被多我的選擇。ide

輸入例子1:測試

3 3 
1 100 
10 1000 
1000000000 1001 
9 10 1000000000

輸出例子1:this

100 
1000 
1001

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

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 + "]";
        }       
    }
相關文章
相關標籤/搜索