题意
给我们一个数串 让我们从中挑选数字 构成一个集合
使得集合中最小元素m和最大元素M 满足 m*p>=M
求出集合的最大数量
分析
看下条件就可以发现 m*p >=M
也就是在数串中找m*p>=x
x的上界
那么排下序二分找即可
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100010];
int main()
{ll n,p;scanf("%lld%lld",&n,&p);for(int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n);int ans=0;for(int i=1;i<=n;i++){ll lim = a[i]*p;int l=1,r = n,mid;while(l<=r){mid = l+r>>1;if(lim>=a[mid])l = mid+1;else r = mid-1;}l = min(l,(int)n+1);ans = max(ans,l-i); }printf("%d\n",ans);return 0;
}