時間限制:2秒
空間限制:65536K
為了找到自己滿意的工作,牛牛收集了每種工作的難度和報酬。牛牛選工作的标準是在難度不超過自身能力值的情況下,牛牛選擇報酬最高的工作。在牛牛標明了自己的工作後,牛牛的小夥伴們來找牛牛幫忙選工作,牛牛依然使用自己的标準來幫助小夥伴們。牛牛的小夥伴太多了,于是他隻好把這個任務交給了你。
輸入描述:
每個輸入包含一個測試用例。
每個測試用例的第一行包含兩個正整數,分别表示工作的數量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
這道題的思考了一會就上手寫了,這也導緻我寫了一下午的時間,血的教訓啊,是以寫題之前一定要考慮清楚在寫題(下次肯定不會上手就寫了)
這道題邏輯上并不難,主要考察的是如何在有限的時間裡,找到最大的工資,時間是個問題,我的代碼逾時了,但是解題思路是一樣的,可以對思路進行參考。
這道題大緻分為3步
1.寫一個數組,記錄工作難度(Di)
2.寫一個Map,用來記錄難度對應的工資(Pi)
3.找出小于等于Di的最大Pi值 就是答案了。
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
public class 牛牛找工作 {
//可以用二維數組,也可以用HsahMap來存儲,至于比對後面再寫。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//工作數量
int N = scanner.nextInt();
//小夥伴數量
int M = scanner.nextInt();
//使用HashMap來存儲工作難度和報酬
HashMap<Integer,Integer> mWork = new HashMap<>();
//使用ArrayList記錄難度之後排序;
int [] DiList =new int[N];
for (int i = 0; i < N; i++) {
//難度
int Di = scanner.nextInt();
//報酬
int Pi = scanner.nextInt();
if(mWork.containsKey(Di)){
if(mWork.get(Di) < Pi){
mWork.replace(Di,Pi);
}
}else{
mWork.put(Di,Pi);
}
DiList[i] = Di;
}
//存儲完工作和報酬,就要開始通過小夥伴的能力值來判斷工資了。
//先将ArrayList排序
Arrays.sort(DiList);
for (int i = 0; i < M; i++) {
int MDi = scanner.nextInt();
int Max = -1;//最大工資
for (int j = 0; j < N; j++) {
if(MDi >= DiList[j]){
//确定比對範圍。大于Di就不要找了。
Max = Math.max(mWork.get(DiList[j]),Max);
}
}
System.out.println(Max);
}
}
}
通過率是30%,可能是我确定Max的時候複雜度太高所導緻的。