题目描述
给定一个正整数数列,和正整数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;
}