给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 105)是输入的正整数的个数,p(<= 109)是给定的参数。第二行给出N个正整数,每个数不超过109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100000
long long num[MAX];
void sort(long long n[],int len);
void quicksort(long long r[],int start,int end);
int comp(const void* a,const void* b)
{
if(*(long long*)a<*(long long*)b) return -1;
if(*(long long*)a==*(long long*)b) return 0;
if(*(long long*)a>*(long long*)b) return 1;
}
int main()
{
int N,i,j;
long long p;
long long sum ;
long long m;
int max = 0;
int count=0;
scanf("%d%lld",&N,&p);
for(i=0;i<N;i++)
scanf("%lld",&num[i]);
qsort(num,N,sizeof(long long),comp);
for(i=0;i<N;i++)
{
sum = num[i]*p;
for(j=i+count;j<N;j++)
{
if(num[j]<=sum)
{
count =j-i+1;
}
else
break;
}
if(count > max)
max = count;
}
printf("%d",max);
return 0;
}
void sort(long long n[],int len)
{
int i,j;
long long tmp;
for(i=len-1;i>0;i--)
for(j=0;j<i;j++)
{
if(n[j]>n[j+1])
{
tmp = n[j];
n[j]=n[j+1];
n[j+1]=tmp;
}
}
}
void quicksort(long long r[],int start,int end)
{
int i=start;
int j=end;
long long temp=r[start];
if(i<j)
{
while(i!=j)
{
while(i<j&&r[j]>=temp)
j--;
if(i<j)
{
r[i]=r[j];
i++;
}
while(i<j&&r[i]<temp)
i++;
if(i<j)
{
r[j]=r[i];
j--;
}
}
r[i]=temp;
quicksort(r,start,i-1);
quicksort(r,i+1,end);
}
}