#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
//typedef long long LL;
#define maxn 100010
int a[maxn],n,p;
int pd(int i,long long x)
{
if(a[n-1]<=x)
return n;
int l=i+1,r=n-1,mid;
while(l<r)
{
mid=(l+r)/2;
if(a[mid]<=x)
l=mid+1;
else
{r=mid;}
}
return l;
}
int main()
{
scanf("%d%d",&n,&p);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
int ans=1;
for(int i=0;i<n;i++)
{
int j=pd(i,(long long)a[i]*p);
ans=max(ans,j-i);
}
printf("%d\n",ans);
return 0;
}
如果用到STL的两个函数,代码会更简短
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
#define maxn 100010
int a[maxn];
int main()
{
int n,p;
scanf("%d%d",&n,&p);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
int ans=1;
for(int i=0;i<n;i++)
{
int j=upper_bound(a+i+1,a+n,(long long)a[i]*p)-a;
ans=max(ans,j-i);
}
printf("%d\n",ans);
return 0;
}