网易2019年实习生笔试题合集《牛牛找工作》 未ac(超时) 笔记

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


猜你喜欢

转载自blog.csdn.net/qq_40033365/article/details/80258831