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