注意点:int*int 最大值可能达到10^18
暴力解决的时间复杂度肯定超时。
#include <iostream>#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100001;
int num[maxn];
int binarySearch(int i,int n,long long x){ //logn
// int mid=(i+n)/2;
int l=i+1,r=n-1,mid;
if(num[r]<=x) return n;
while(l<r){
mid=(l+r)/2;
if(num[mid]<=x) l=mid+1;
else{
r=mid;
}
}
return l;
}
int main(int argc, char** argv) {
int n,p; //int*int may be out of boundary;
scanf("%d%d",&n,&p);
for(int i=0;i<n;i++) scanf("%d",&num[i]);
sort(num,num+n);
int ans=1;
for(int i=0;i<n;i++){
int j=binarySearch(i,n,(long long)num[i]*p); //每次从最小值走,寻找最大的<=第三个参数
ans=max(j-i,ans);
}
printf("%d",ans);
return 0;
}