1030 完美数列(25 分)

给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 Mmp,则称这个数列是完美数列。

现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。

输入格式:

输入第一行给出两个正整数 N 和 p,其中 N(105​​)是输入的正整数的个数,p(109​​)是给定的参数。第二行给出 N 个正整数,每个数不超过 109​​。

输出格式:

在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。

输入样例:

10 8
2 3 20 4 5 1 6 7 8 9

输出样例:

8
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;

int main(){
    int n = 0;
    long long p = 0;
    scanf("%d %lld", &n, &p);
    vector<long long> conq(n, 0);//定义一个迭代器,有n个数赋初值为0
    for (int i = 0; i < n; i++)
        scanf("%lld", &conq[i]);
    sort(conq.begin(), conq.end());//将输入的由小到大排列
    int len = 0;//保存存储完美数列的数的数量
    long long  m = conq[0] * p;//conq[0]是最小值,看看后面有多少个数比他和q相乘大
    for (int i = 0; i < n; i++){
        if (conq[i] >= conq[0] && conq[i] <= m)
            len++;
    }
    if (len == n){//如果完美数列是由全部数组成的,直接输出结束程序
        printf("%d", len);
        return 0;
    }
    for (int i = 1; i < n; i++){//如果不是就从第一个数开始,看看有没有组成数列比原先大的,有就加上大的值,没有就跳出输出
        int j = 0;
        for (; j + len + i < n && j < n; j++){
            if (conq[j + len + i] <= conq[i] * p)
                continue;
            else
                break;
        }
        len += j;
    }
    printf("%d", len);
    return 0;
}
原文地址:https://www.cnblogs.com/fromzore/p/9573013.html