题目描述

分析:
二分查找,首先先从小到大排序,完后找子序列,可以直接用upper_bound函数找,也可以用二分查找找
#include<iostream>
#include<algorithm>
using namespace std;
int n,p,a[100005];
int binarySearch(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(){
cin>>n>>p;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int ans=1;
for(int i=0;i<n;i++){
int j=binarySearch(i,(long long)a[i]*p);
ans=max(ans,j-i);
}
cout<<ans<<endl;
}
解法2:双指针法
#include<iostream>
#include<algorithm>
using namespace std;
int n,p,a[100005];
int main(){
cin>>n>>p;
for(int i=0;i<n;i++)
cin>>a[i];
sort(a,a+n);
int i=0,j=0,count=1;
while(i<n&&j<n){
while(j<n&&a[j]<=(long long)a[i]*p){
count=max(count,j-i+1);
j++;
}
i++;
}
cout<<count<<endl;
}