给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
暴力查找的时候注意,优化,即在循环外层的时候,至少可以少跑ma个间隔,因为有之前的状态满足,只需找更大的。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<set>
#include<map>
#include<queue>
#define inf 0x3f3f3f3f
#define LL long long
using namespace std;
LL arr[100010];
int main(){
LL n,m,i,j,k;
while(~scanf("%lld%lld",&n,&m)){
for(i = 0;i < n;++ i)
scanf("%lld",&arr[i]);
sort(arr,arr+n);
LL ma = 0,po = 0,num;
for(i = 0;i < n;++ i){
for(j = i+1+ma;j < n;++ j){
if(arr[i]*m >= arr[j]){
if(ma < (j-i+1))
ma = j - i+1;
}
else break;
}
}
printf("%lld\n",ma);
}
return 0;
}