现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤105 )是输入的正整数的个数,p(≤109 )是给定的参数。第二行给出 N 个正整数,每个数不超过 109 。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
思路是先排序,从第0个开始作为最小值,计算出mp的长度,然后在后面的数字中找到满足M≤mp的最大值,用两个下标相减加一得到个数,用一个整数d来储存满足条件的最大个数,每一次循环都判断一次当前是否是最大的个数。
一开始我用两个for循环来逐个遍历,但是超时了,用Arrays自带的二分查找改进了一下,还是超时了。牛客网上显示数组越界,网上其他的C++答案改写成JAVA很多样例直接不通过。
各位读者如果有更好的办法,欢迎在评论区留言讨论。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
long[] np = stii(bf.readLine());
long[] arr = stii(bf.readLine());
long p = np[1];
Arrays.sort(arr);
int d = 0;
for (int i = 0; i < np[0]; i++) {
long m = arr[i];
long mp = m * p;
int index = Arrays.binarySearch(arr, mp);
if (index >= 0) {
int temd = index - i + 1;
d = d > temd ? d : temd;
} else {
index = -index - 2;
if (index >= arr.length) {
index = arr.length - 1;
long M = arr[arr.length - 1];
if (M > mp) {
continue;
}
}
int temd = index - i + 1;
d = d > temd ? d : temd;
}
if (index == arr.length - 1) {
break;
}
}
out.print(d);
out.flush();
}
static long sti(String a) {
return Long.parseLong(a);
}
static long[] stii(String a) {
String[] ra = a.split(" ");
long[] r = new long[ra.length];
for (int i = 0; i < r.length; i++) {
r[i] = sti(ra[i]);
}
return r;
}
}