思路:首先,这道题的意思就是将数列进行排序,
然后在有序数列中找到满足(最大值是 M,最小值是 m, M≤mp)的数列(使用二分法找到小于或等于s的最大的数的索引)
输出个数最多的数列的元素个数,代码如下:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;;
vector<ll> arr;
ll cnt, p;
//获取小于或等于s的最大数的索引
//最后一个数据超出int范围,如果参数用int会出错
int upper_bound(ll s){
int i=0,j=arr.size()-1;
while(i<j){
int mid=(i+j)/2+1;
if(arr[mid]<=s){
i=mid;
}else{
j=mid-1;
}
}
return j;
}
int main(){
cin>>cnt>>p;
ll temp;
for(int i=0;i<cnt;i++){
cin>>temp;
arr.push_back(temp);
}
sort(arr.begin(),arr.end());
ll mx=0,idx=0;
for(int i=0;i<cnt;i++){
idx=upper_bound(arr[i]*p);//找到小于或等于m*p的最大的元素索引
if(mx<idx-i+1){//判断个数是否比原来的个数大
mx=idx-i+1;
}
}
cout<<mx;
return 0;
}