1. 程式人生 > >網易筆試題 牛牛找工作

網易筆試題 牛牛找工作

為了找到自己滿意的工作,牛牛收集了每種工作的難度和報酬。牛牛選工作的標準是在難度不超過自身能力值的情況下,牛牛選擇報酬最高的工作。在牛牛選定了自己的工作後,牛牛的小夥伴們來找牛牛幫忙選工作,牛牛依然使用自己的標準來幫助小夥伴們。牛牛的小夥伴太多了,於是他只好把這個任務交給了你。
輸入描述:
每個輸入包含一個測試用例。
每個測試用例的第一行包含兩個正整數,分別表示工作的數量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

一開始看到題,首先想到的肯定是窮舉,先把工作按照工資從高到低排序 然後對每個員工的能力從工作第一個開始比較,找到能力足夠的就輸出,但是時間超時了

只能進行優化了.先將工作按照難度從小到大排序,對每個難度進行更新,可以得出每個難度對應能得到最高的工資是多少,將該資訊存入到TreeMap中,再利用TreeMap的floorKey輸出結果

public static
void main(String[] args) { Scanner scanner = new Scanner(System.in); //工作數量 int workNum = scanner.nextInt(); //夥伴數量 int pNum = scanner.nextInt(); int[][] arr = new int[workNum][2]; for (int i = 0; i < workNum ; i++) { int ai = scanner.nextInt(); int
sa = scanner.nextInt(); arr[i][0] = ai; arr[i][1] = sa; } Arrays.sort(arr, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[0] - o2[0]; } }); for (int i = 1; i < workNum ; i++) { arr[i][1] = Math.max(arr[i - 1][1],arr[i][1]); } TreeMap<Integer, Integer> map = new TreeMap<>(); for (int i = 0; i < workNum; i++) { map.put(arr[i][0],arr[i][1]); } for (int i = 0; i < pNum; i++) { int ai = scanner.nextInt(); Integer index = (Integer)map.floorKey(ai); if(index != null) System.out.println(map.get(index)); else System.out.println(0); } }