(java实现)


题目描述:

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

输入描述:

每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量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

输出

100
1000
1001


问题分析:

核心是用HashMap来记录难度和不超过该难度的最大报酬。
先把工作的难度和报酬映射到HashMap
把人的能力也全部读进来,放到HashMap,报酬可以先设为0.
最后按难度从小到大(所以需要先排序)更新HashMap,key为难度,value为不超过难度的最大报酬。

work 和 worker 可以作为结构体节点:
work按照工作难度(di)从小到大排序,如果遇到相同的难度则按照薪资(pi)从大到小排序;
worker按照学生的能力从小到大排序,同时给worker增加id标识,以便后期正确输出;
为每个worker寻找符合其工作能力的最大薪资工作,因为工作和worker是排序好的,
所以下一个worke的能力一定是大于上一个worker的能力,下一个工作的要求也是要高于上一个工作的要求,所以在计算下一个学生的时候,
只需在上一个基础上继续进行,要么其和上一个worker相同,要么会得到要求更高,薪资更高的工作。

相关知识:


参考代码:

思路一实现:

import java.util.*;
public class Main {

    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        while (input.hasNext())
        {
            int n = input.nextInt();
            int m = input.nextInt();
            //输入工作能力和报酬
            //ArraysList<Work> work = new ArraysList<Work>();
            List<Work> work = new ArrayList<Work>();
            for (int i=0; i<n; i++)
            {
                work.add(new Work(input.nextInt(), input.nextInt()));
            }
            //Collection.sort(work,new MyComparator());
            Collections.sort(work,new MyComparator());
            //输入工人能力
            List<Work> worker = new ArrayList<Work>();
            for (int i=0; i<m; i++)
            {
                worker.add(new Work(input.nextInt(), i));
            }
            Collections.sort(worker, new MyComparator());
            int[] res = new int[m];
            int count = 0, max = 0;
            for (int i=0; i<m; i++)
            {
                while (count<n && worker.get(i).id>=work.get(count).id)
                {
                    max = Math.max(max, work.get(count).pay);
                    count++;
                }
                res[worker.get(i).pay] = max;
            }
            for (int i=0; i<m; i++)
                System.out.println(res[i]);
        }
    }
}

class Work
{
    int id;
    int pay;
    public Work(int id, int pay)
    {
        this.id = id;
        this.pay = pay;
    }
}

class MyComparator implements Comparator<Work>
{
    public int compare(Work w1,Work w2)
    {
        return w1.id-w2.id;  //升序
    }
}