</pre><pre name="code" class="cpp">#include<cstdio><span style="white-space:pre"> </span>//两点法,为什么必须去掉下面的判断语句,当j = n-1时
#include<algorithm>
using namespace std;
int main(){
long long n,p;
scanf("%lld %lld",&n,&p);
long long a[n];
for(int i = 0;i < n;i++)
scanf("%lld",&a[i]);
sort(a,a+n);
int i = 0,j = 0,maxN = 1;
while(i<n&& j < n){
while(a[i]*p>=a[j]&&j<n) j++;
//if(a[i]*p<a[j]){
maxN = max(maxN,j-i);
i++;
//}
}
printf("%d\n",maxN);
return 0;
}
//二分法
#include<cstdio>
#include<algorithm>
//二分法
using namespace std;
int binarySearch(long long a[],int s,long long n,long long x){
if(a[n-1]<=x) return n; <span style="white-space:pre"> </span>//这个没有考虑到
int l = s+1,r = n-1;
while(l<r){
int mid = (l+r)/2;
if(a[mid]>x)
r = mid;
else
l = mid+1;
}
return l;
}
int main(){
long long n,p;
scanf("%lld %lld",&n,&p);
long long a[n];
for(int i = 0;i < n;i++)
scanf("%lld",&a[i]);
sort(a,a+n);
int maxN = 1; //记录最大值
for(int i = 0;i < n;i++){
maxN = max(maxN,binarySearch(a,i,n,a[i]*p)-i);
/*
int l = i+1,r = n-1;
while(l<r){
int mid = (l+r)/2;
if(a[i]*p>=a[mid]){ //符合要求,可向右走
if(mid-i>max)
max = mid-i;
l = mid+1;
}
else { //偏大,向左
r = mid;
}
}
*/
}
printf("%d\n",maxN);
return 0;
}