1030 完美数列(25)(25 分)
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 10^5^)是输入的正整数的个数,p(<= 10^9^)是给定的参数。第二行给出N个正整数,每个数不超过10^9^。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
这个题我一开始的思路是先排序,然后遍历数组,每次从当前数字开始一直找到最大值。
结果,有一个“运行超时”和一个“答案错误”的报错。
于是做了修改:
1.关于运行超时:其实可以不必从当前数字开始找最大值,而直接从前一个数字所找的最大数的下一个数字开始。
2.关于答案错误:居然是把p从int类型改成long int类型就解决了。
可是int的范围明明可以包括10^9,我不太明白,求解。
我的代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int m,M,N,max=0,j=1;
long int p;
int a[100002];
//输入,怕超时用的scanf
scanf("%d %d",&N,&p);
for(int i=1;i<=N;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+N+1);//排序
for(int i=1;i<=N;i++)
{
m = a[i];
while(a[j]<=(m*p)&&j<=N)
{
j++;//记录最大值的下一个数字的下标
}
if((j-i)>max)
{
max = j-i;
}
}
printf("%d",max);
system("pause");
return 0;
}