时间限制: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的时候复杂度太高所导致的。