找一堆数中满足 最大值M <= 最小值m * 给定值p 的最长数列
二分套模板
# include <iostream>
# include <algorithm>
using namespace std;
int A[100010];
int N;
// 在[low, high]([i, N])中寻找第一个大于x的数(套模板,相当于upper_bound)
int bisearch(int low, int high, long long x)
{
int mid;
while(low < high)
{
mid = (low+high) / 2;
if(A[mid] > x)
high = mid;
else
low = mid+1;
}
return low;
}
int main()
{
int p, ans = 0, i;
cin >> N >> p;
for(i = 0;i < N;++i)
cin >> A[i];
sort(A, A + N);
for(i = 0;i < N;++i){
// int j = upper_bound(A+i+1, A+N, (long long)A[i] * p) - A; // 可直接使用algorithm中的upper_bound函数
int j = bisearch(i+1, N, (long long)A[i] * p); // 在中寻找第一个大于x的数[i, N]
ans = max(ans, j-i); // 如果当前完美数列的数更大就更新
}
cout << ans << endl;
return 0;
}