打败魔人布欧以后,孙悟空收了n个徒弟,每个徒弟战斗力各不相同。他教导所有的徒弟和体术,合体后战斗力为原战斗力相乘。任何两个徒弟都可以合体,所以一共有n*(n-1)/2种合体徒弟。有一天,他想考验一下孙悟天战斗力如何,希望在所有n*(n-1)/2种合体徒弟中选择战斗力第k高的,与孙悟天对战。可是孙悟空徒弟太多了,他已然懵逼,于是找到了你,请你帮他找到对的人。
打败魔人布欧以后,孙悟空收了n个徒弟,每个徒弟战斗力各不相同。他教导所有的徒弟和体术,合体后战斗力为原战斗力相乘。任何两个徒弟都可以合体,所以一共有n*(n-1)/2种合体徒弟。有一天,他想考验一下孙悟天战斗力如何,希望在所有n*(n-1)/2种合体徒弟中选择战斗力第k高的,与孙悟天对战。可是孙悟空徒弟太多了,他已然懵逼,于是找到了你,请你帮他找到对的人。
第一行两个int。徒弟数量:n <= 1*10^6;战斗力排名:k <= n*(n-1)/2
第二行空格分隔n个int,表示每个徒弟的战斗力。
战斗力排名k的合体徒弟战斗力。
5 2 1 3 4 5 9
36
import java.util.*; public class Main{ public static void main(String[] args){ Scanner scan = new Scanner(System.in); int n = scan.nextInt(); long k = scan.nextLong(); long[] power = new long[n]; for(int i=0;i<n;i++){ power[i] = scan.nextLong(); } Arrays.sort(power); long l = 1,r = power[n-1]*power[n-2],mid = 0; while(l<r){ mid = (l+r+1)/2; long cnt = 0; int left = 0, right = n-1; while(left<right && cnt<k){ while(power[left]*power[right]<mid) left++; cnt+=Math.max(right-left,0); right--; } if(cnt>=k) l=mid; else r = mid-1; } System.out.println(l); } }