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