同乙级1030完美数列
有两种解法
二分法
#include <iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int maxn=100010;
int n,p;
int a[maxn];
int binarysearch(int i,int n,long long x){
int left=i+1,right=n-1,mid;
if (a[n-1]<=x) return n;
while(left<right){
mid=(left+right)/2;
if(a[mid]<=x) left=mid+1;
else right=mid;
}
return mid;
}
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=binarysearch(i,n,(long long) a[i]*p);
ans=max(ans,j-i);
}
cout<<ans<<endl;
return 0;
}
坑点
如果不考虑,数列都满足的情况,只会得到4分,必须在while中加
if (a[n-1]<=x) return n;