二分查找
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
long long N,p;
vector<long long> a;
int main(){
int x;
scanf("%d%d",&N,&p);
for(int i=0;i<N;i++){
scanf("%d",&x);
a.push_back(x);
}
sort(a.begin(),a.end());
int maxn=0;
int i,j;
for(i=0;i<N;i++){
long long tmp=p*a[i];//int*int!=long long ,最后一个测试点
int pos=upper_bound(a.begin(),a.end(),tmp)-a.begin();
if(maxn<(pos-i)){
maxn=pos-i;
}
}
cout<<maxn<<endl;
return 0;
}
binary_search
:判断是否存在某个对象lower_bound: 返回>=对象的第一个位置
upper_bound: 返回>对象的第一个位置
假定相同值的元素可能有多个
lower_bound 返回第一个符合条件的元素位置
upper_bound 返回最后一个符合条件的元素位置
equal_range 返回所有等于指定值的头/尾元素的位置,其实就是lower_bound和upper_bound
binary_search 返回是否有需要查找的元素。