1. 先将数组排序,不然不好得到最大值和最小值。
2.然后用双指针,一个指向该序列的最大值,一个指向最小值。
3.判断指针的单调性,当最大值不断变大时,最小值也要不断变大。所以都从零开始。
4.因为数据范围为1e9.所以可能爆int所以变为long long
#include <iostream>
#include <algorithm>
using namespace std;
const int N=1e5+10;
int a[N];
int main(){
int n,p;
cin>>n>>p;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int res=0;
for(int i=0,j=0;i<n;i++){
while(j<i&&(long long)a[j]*p<a[i])j++;
res=max(res,i-j+1);}
cout<<res;
return 0;
}
当然也可以把最大值从小到大遍历后,用二分找出符合条件的最小的那个值。