分析了下,暴力解决这个问题的事件复杂度大概是 10^5 * 10^5 200ms 马马虎虎正好够用,先用快速排序对数组中的数字进行排序,再者只需要遍历数组中数字,把从该位开始到多少结束,中间的数字统计一下,最后遍历一下统计的数组就ok了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
const int maxn = 10001;
ll num[maxn];
ll cunt[maxn];
int main(int argc, char** argv) {
int ans = 1;
memset(num,0,sizeof(num));
memset(cunt,0,sizeof(cunt));
int N; ll p;
cin>>N>>p;
for(int i=1;i<=N;i++) cin>>num[i];
sort(num+0,num+N);
for(int i=1;i<=N;i++){
int cnt = 0;
for(int j=i+1;j<=N;j++){
if(num[i]*p >=num[j]){
cnt++;
cunt[i] = cnt;
}
}
}
for(int i=2;i<=N;i++){
if(cunt[i] > cunt[ans]){
ans = i;
}
}
cout<< cunt[ans]+1<<endl;
return 0;
}