乙级(Basic Level) 1020 完美数列

题目描述

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

思路:先排序,然后迭代整个数列(for i to N)找出最长的完美数列,通过记录每一步迭代之后完美数列的长度res,从而跳过(i,i+res)部分的检验,加快程序运行
Python:
a = input().split()
a = [int(i) for i in a]
b = input().split()
b = [int(i) for i in b]
b.sort()
a[0] = 0
for i in range(len(b)):
    for j in range(i+a[0],len(b)):
        if b[j]>b[i]*a[1]:
            if a[0]<j-i:
                a[0] = j-i
            break
    if j==len(b)-1:
        if b[j]>b[i]*a[1]:
            a[0] = j-i
        else:
            a[0] = j-i+1
        break
print(a[0])

 

C++
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100005;
int a[N];
int main()
{
    long long n, p, m = 0;
    cin >> n >> p;
    for (int i = 0; i != n; i++)
        cin >> a[i];
    sort(a, a + n);
    for (long i = 0; i != n; i++)
    {
        for (long j = i + m; j != n; j++)
        {
            if (a[j] > a[i] * p)
                break;
            m++;
        }
    }
    cout << m ;
    return 0;
}

 

posted @ 2018-08-24 13:42  黄冠积  阅读(100)  评论(0编辑  收藏  举报