(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; //升序
}
}
京公网安备 11010502036488号