题目地址:https://www.nowcoder.com/pat/6/problem/4056
题解:先将a数组进行排序,第一次按题意M<=n*p;n=a[0]时,M最大为J(如下图),然后n从a[0]开始,那么M是从J开始遍历,就可以算出每一次的最大长度。当J到达a数组尾部,时遍历结束。可以算出完美数列最大长度
/**
* Copyright(c)
* All rights reserved.
* Author : YCute
* Date : 2019-11-18-21.21.21
* Description : 排序后拿到最多的数
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int n,p;
int a[];
scanf("%d %d",&n,&p);
for(int i=;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
long long temp=a[]*p;
int i;
for(i=;i<n;){
if(a[i]<=temp) i++;
else break;
}
//获取第一次的长度
int MAX=i;
int j=i;
//一次遍历,拿到最大的长度;
for(int i=;i<n;i++){
temp=a[i]*p;
//cout<<temp<<endl;
while(a[j]<=temp&&j<n){
j++;
}
//cout<<j-i<<endl;
MAX=MAX>(j-i)?MAX:(j-i);//本次temp长度是否最大
if(j==n)break;//到达了数组尾部,直接结束
}
printf("%d\n",MAX);
return ;
}