给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤105)是输入的正整数的个数,p(≤109)是给定的参数。第二行给出 N 个正整数,每个数不超过 109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
错误原因:以为只需要将数据进行排序,以第一个数作为最小值然后依次往后寻找符合条件的最大值并记录个数即可,但实际上由于数据大小分布不均匀,这种情况并不一定白分白满足,正确的做法应该是使用一个双层循环,在排序之后依次移动最小数的值,统计不同的个数取最大;
代码如下:(C)
#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a,const void *b)
{
if(*(long long*)a>*(long long *)b)
return 1;
else
return -1;
}
int main(void)
{
long long i, j=0, n, q, m=0;//m为满足条件的数列中元素的个数
long long *p;
scanf("%lld %lld",&n,&q);
p = (long long *)calloc(n,sizeof(long long));
for(i=0;i<n;i++)
scanf("%lld",&p[i]);
qsort(p,n,sizeof(long long),cmp);
for(i=0;i<n-m;i++)
{
for(;p[j]<=p[i]*q&&j<n;j++);
if((j-i)>m)
m=j-i;
}
printf("%lld",m);
}