网易2019笔试牛牛找工作Java解法

题目描述

为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。

输入描述

每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。

输出描述

对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。

输入示例

3 3 
1 100 
10 1000 
1000000000 1001 
9 10 1000000000

输出示例

100 
1000 
1001

分析

这道题看似像动态规划中的01背包问题,但是不是,一开始我以为是动态规划问题,直接就写了个01背包,发现java内存溢出了,其实这道题的精髓在于第一句话:牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。就是说在工作难度小于等于自身能力的工作中,选择其中最高的报酬,所以说这道题考的就不是动规,而是排序和查找

解法:代码中做了详细的注释,一看便知,我已经在牛客网上运行通过了,可以直接复制

import java.util.Arrays;
import java.util.Scanner;
import java.util.TreeMap;

public class 牛牛找工作 {
    public static void main(String[] args) {
        //输入流
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();//n表示工作的数量
        int m = sc.nextInt();//m表示同学的数量

        // jobs数组 n行2列 n行表示n个工作,第一列表示工作的难度, 第二列表示工作的报酬
        int[][] jobs = new int[n][2];
        for (int i=0;i o1[0]-o2[0]));//按照工作难度从小到大排序

        //很重要 我们把每个工作的报酬设置为 难度比他小的这些工作中的最大报酬
        for (int i=1;i map = new TreeMap<>();
        for (int i=0; i

 

你可能感兴趣的:(JAVA实习找工作)