1 题目
2 代码
import java.util.Arrays;
import java.util.Scanner;
public class B1030 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
long p = sc.nextLong();
int[] num = new int[N];
for (int i = 0; i < N; i++) {
num[i] = sc.nextInt();
}
Arrays.sort(num);
int maxLen = 1;
for (int i = 0; i < N; i++) {
int left = i + 1;
int right = N;
while (left < right) {
int mid = (left + right) / 2;
if (num[mid] > num[i] * p)
right = mid;
else left = mid + 1;
}
maxLen = Math.max(maxLen, left - i);
}
System.out.println(maxLen);
}
}
3 要点
(1)不能设置二分法跳出的条件为while (left <= right)
,而应该是while (left < right)
,因为left==right
时程序会陷入死循环。
(2)如果取int left = i;int right = N - 1;
,每次偶数个数字时,mid只能取到左边的中间数,测试点一会过不去。取int left = i + 1;int right = N;
刚好通过。
(3)二分法的题解。