AtCoder Regular Contest 037 C: 億マス計算 (二分探索)
解法
各a[i]の段のmid以下のa*bの数をカウントし、それがKとなるようにmidを二分探索する。
コード
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); int K = sc.nextInt(); long[] a = new long[N]; for (int i = 0; i < a.length; i++) { a[i] = sc.nextInt(); } long[] b = new long[N]; for (int i = 0; i < b.length; i++) { b[i] = sc.nextInt(); } sc.close(); Arrays.sort(a); Arrays.sort(b); long low = 0; long high = Long.MAX_VALUE; while (high - low > 1) { long mid = (low + high) / 2; int count = 0; int index = N;// a[i]の段におけるmidより小さいa*bの数 for (int i = 0; i < N; i++) { while (index > 0 && a[i] * b[index - 1] > mid) { index--; } count += index; } if (count >= K) { high = mid; } else { low = mid; } } System.out.println(high); } }