首先先对输入的数进行排序,从小到大使用快速排序。
拍完序后再去查找最长的序列。查找的过程可以在循环中加入一个当前找到的最长序列,以减小时间复杂度。
#include<stdio.h>
int qw(long long int z[],long long int left,long long int right){//快速排序,也可以用qsort
long long int temp,a,i,j;
if(left>right)
return 0;
temp=z[left];
i=left;
j=right;
while(i!=j){
while(i<j&&z[j]>=temp)
j--;
while(i<j&&z[i]<=temp)
i++;
if(i<j){
a=z[i];
z[i]=z[j];
z[j]=a;
}
}
z[left]=z[i];
z[i]=temp;
qw(z,left,i-1);
qw(z,i+1,right);
return 0;
}
int main()
{
long long int n,p,z[100000],a,b,c,max=0;
scanf("%lld %lld",&n,&p);
for(a=0;a<n;a++)
scanf("%lld",&z[a]);
qw(z,0,n-1);
for(a=0;a+max<=n;a++)
for(b=a+max;b<n;b++){
if(z[a]*p>=z[b])
max=b-a+1;
else
break;
}
printf("%lld",max);
return 0;
}