一点小技巧降低计算复杂度,每次搜寻序列允许的最大值的时候,从上次的位置开始搜寻,这样可以将整个过程搜索序列允许最大值的复杂度降到O(N),其中N为输入序列的长度。
另外,需要用long long否则最后一个样例出错。
#include<cstdio>
#include<vector>
#include<string>
#include<iostream>
#include<queue>
#include<set>
#include<algorithm>
#define maxn 100100
using namespace std;
long long n[maxn], N;
int main() {
long long p;
scanf("%lld %lld", &N, &p);
for(int i = 0; i < N; i++) {
scanf("%lld", &n[i]);
}
sort(n, n + N);
int out = 0, j = 0;
for (int i = 0; i < N; i++) {
long long m = n[i] * p;
for (; j < N; j++) {
if (n[j] > m) break;
}
if (j - i > out) out = j - i;
}
printf("%d\n", out);
}