码迷,mamicode.com
首页 > 其他好文 > 详细

1030 完美数列(25 分)

时间:2018-09-02 11:07:06      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:开始   psu   main   一个   格式   htm   ups   margin   nts   

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

现在给定参数 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
#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;
}

 

1030 完美数列(25 分)

标签:开始   psu   main   一个   格式   htm   ups   margin   nts   

原文地址:https://www.cnblogs.com/fromzore/p/9573013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!