package practice;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
/**
- 输入描述:
- 每个输入包含一个测试用例。
- 每个测试用例的第一行包含两个正整数,分别表示工作的数量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
*/
public class FindWork {
@SuppressWarnings({ "rawtypes", "resource", "unused", "unchecked" })
public static void main(String args[]){
Scanner input=new Scanner(System.in);
int work_num;
int person_num;
long Pi[]=new long[100000];
long Di[]=new long[100000];
long Ai[]=new long[100000];
long arg[]=new long[200005]; //人能力值+工作能力值
long result[]=new long[200005];
HashMap map=new HashMap();
work_num=input.nextInt();
person_num=input.nextInt();
for(int i=0;i<work_num;i++){
Di[i]=input.nextLong();
Pi[i]=input.nextLong();
arg[i]=Di[i];
}
for(int i=0;i<person_num;i++){
Ai[i]=input.nextLong();
arg[i+work_num]=Ai[i];
}
Arrays.sort(arg); //对所有能力值进行排序
int num=0;
map.put(arg[0],num);
//过滤掉重复的map中记录能力值和在所有能力值中的索引
for(int i=1;i<arg.length;i++){
if(arg[i]!=arg[i-1]){
num++;
map.put(arg[i],num);
}
}
//将工作能力值所用到的报酬进行匹配
for(int i =0;i<work_num;i++){
result[(int) map.get(Di[i])]=Math.max(result[(int) map.get(Di[i])], Pi[i]);
}
//将还没有记录报酬的能力值进行赋值 同时将小于自身能力的最大报酬进行赋值 得到在此能力下可以获得的最大报酬
for (int i = 1 ; i < work_num+person_num ;i++)
result[i] = Math.max(result[i],result[i-1]);
for (int i = 0 ; i < work_num ;i++)
System.out.println(result[(int) map.get(Ai[i])]);
}
}
转载于:https://www.cnblogs.com/lihuidong/p/11385637.html