牛客网-牛牛找工作

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])]);
      
  }

  

}
posted @ 2019-08-20 21:01  啾啾啾lhd  阅读(171)  评论(0编辑  收藏  举报