每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。
对于每个小伙伴,在单独的一行输出一个整数表示他能得到的最高报酬。如果他找不到工作,则输出0。一个工作可以被多个人选择。
3 3 1 100 10 1000 1000000000 1001 9 10 1000000000
100 1000 1001
import java.util.Arrays; import java.util.Scanner; public class Main { private static int[][] Jobs; private static int N, M; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt();//工作 M = sc.nextInt();//人 Jobs = new int[N][2]; for (int i = 0; i < N; ++i) { Jobs[i][0] = sc.nextInt(); Jobs[i][1] = sc.nextInt(); } Arrays.sort(Jobs, (int[] a, int[] b) -> { return a[0] - b[0]; }); for (int i = 1; i < N; i++) { Jobs[i][1] = Math.max(Jobs[i][1], Jobs[i - 1][1]); } for (int i = 0; i < M; i++) { int ai = sc.nextInt(); if (ai < Jobs[0][0]) { System.out.println(0); } else if (ai >= Jobs[N - 1][0]) { System.out.println(Jobs[N - 1][1]); } else { binarySearch(ai); } } } private static void binarySearch(int ai) { int lo = 0; int hi = N; //第一个大于 while (lo < hi) { int mid = lo + (hi - lo) / 2; if (Jobs[mid][0] < ai) { lo = mid + 1; } else if (Jobs[mid][0] > ai) { hi = mid; } else { System.out.println(Jobs[mid][1]); return; } } System.out.println(Jobs[hi - 1][1]);//最后一个不大于 } }