PAT训练-1030. 完美数列(25)

给定一个正整数数列,和正整数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;

}

发表评论