乙级(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; }