题目链接:点击打开链接
知识点笔记:
AC代码:
#include <cstdio>
#include <algorithm>
using namespace std;
/*
* 1.先排序
* M <= m * p,则称这个数列是完美数列。
*/
int main() {
long long n,p,a[100010];
scanf("%lld %lld",&n,&p);
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
}
sort(a,a+n);
int ans=1;
int i,left,right;
for(i=0;i<n;i++){
long long mp=a[i]*p;
left=i+1;
right=n-1;
if(a[right]<mp) //如果最大的数都小于mp,则从i到最后都满足
right=n;
else{
//二分查找部分
while(left<right){
int mid=(left+right)/2;
if(a[mid]<=mp) //在mid右边
left=mid+1;
else
right=mid;
}
}
ans= max(ans,right-i);
//在a[i+1]~a[n-1]中查找第一个超过a[i]*p的数,然后把它的位置给j
//前闭后开区间
//int j = upper_bound(a+i+1,a+n,a[i]*p)-a;
//ans=max(ans,j-i);
}
printf("%d\n",ans);
return 0;
}