给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入第一行给出两个正整数N和p,其中N(<= 105)是输入的正整数的个数,p(<= 109)是给定的参数。第二行给出N个正整数,每个数
不超过109。
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
10 8 2 3 20 4 5 1 6 7 8 9
8
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); long p = sc.nextLong(); long [] arr = new long [n]; for (int i = 0; i < arr.length; i++) { arr[i] = sc.nextLong(); } Arrays.sort(arr); int max = 0, index = 0; long maxNum = 0; for(int i = 0; max <= n - i || i < n; i++){ //i不能越界,其次要是数组里剩余的数还比找的max还少,那就不用枚举了 maxNum = arr[i] * p; index = getIndex(arr, i, maxNum); if(index != -1){ max = Math.max(max, index - i + 1); } } System.out.println(max); } private static int getIndex(long[] arr, int i, long maxNum) { int l = i, h = arr.length - 1, mid = 0; while(l <= h){ mid = l + (h - l) / 2; if(arr[mid] == maxNum) return mid; else if(arr[mid] < maxNum){ l = mid + 1; }else { h = mid - 1; } } if(arr[mid] < maxNum) return mid; return mid - 1; } }
import java.util.Arrays; import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in=new Scanner(System.in); int n=in.nextInt(); int p=in.nextInt(); int []num=new int[n]; for(int i=0;i<n;i++) { num[i]=in.nextInt(); } Arrays.sort(num); int result=0; for(int i=0;i<num.length;i++) { for(int j=i+result;j<num.length;j++) { if(num[j]<=num[i]*p) { if(j-i+1>result) { result=j-i+1; } } else { break; } } } System.out.println(result); } }