题意:给一个序列和一个正整数p,当一个序列最大值M最小值m满足就称这个序列为完美序列,现在问从原本的序列中最多能选多少个数使之成为完美序列。
思路:先把原本序列排序,然后遍历一遍,每次取最小值算出上限二分即可求出完美序列的长度,取长度最大即可。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int MAX_N = 100010;
ll a[MAX_N];
int n;
ll p;
int ans;
int main() {
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
scanf("%d %lld", &n, &p);
for (int i = 0; i < n; i++) scanf("%lld", &a[i]);
sort(a, a+n);
ans = 1;
for (int i = 0; i < n-1; i++) {
ll ma = a[i] * p;
int t = upper_bound(a+i, a+n, ma) - a;
ans = max(ans, t-i);
}
printf("%d\n", ans);
return 0;
}