给定一个正整数数列,和正整数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
首先,两个数乘很可能越界,故选用double,另外如果不优化暴力寻找肯定超时,所以我们先排序,在以第一个为最小的数找到maxline后,之后直接比较我们把第二个数做最小数时候,j+max后的数是否可以加入进来,再比较max长度即可。不能想当然认为找到最小数即可
代码:
//
// main.cpp
#include <iostream>
#include <queue>
#include <iomanip>
#include <math.h>
#include <vector>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
int main(int argc, const char * argv[]) {
int count;
cin>>count;
double p = 0;
cin>>p;
double pool[100010];
double small = 999999999;
for(int i = 0; i< count;i++)
{ double temp =0;
cin >> temp;
if(temp < small)
small = temp;
pool[i]= temp;
}
sort(pool, pool+count);
int max =0;
for(int i = 0 ;i < count;i++)
{
for(int j = i+ max;j < count;j++){
if(pool[j] > pool[i]*p)
break;
if(j – i +1 >max);
max= j- i + 1;
}
}
cout<<max;
}