1030. 完美数列(25)

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

分析:用双指。i指向当前最小元素,j指向当i为最小元素是满足规则的最大元素的下一个元素。计算出当前完美数列的元素个数,并与最大的元素个数进行比较更新。

#include <iostream>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
long long input[100010];
int main()
{
    int n,p;
    cin>>n>>p;
    for(int i=0;i<n;i++)
    {
        scanf("%I64d",&input[i]);
    }
    sort(input,input+n);
    int max_num=0;
    for(int i=0,j=i+1;i<n;i++)
    {
        int now_long=0;
        while(j<n&&input[j]<=input[i]*p)
        {
            j++;
        }
        if(j<n)
        {
            now_long=j-i;
        }
        else if(j>=n)
        {
            if(input[j-1]<=input[i]*p)
            {
                now_long=j-i;
            }
            else
            {
                now_long=0;
            }
        }
        
        if(now_long>max_num)
        {
            max_num=now_long;
        }
    }
    printf("%d\n", max_num);
    return 0;
}

 

posted @ 2017-02-07 08:54  Num.Zero  阅读(214)  评论(0编辑  收藏  举报