一、题目
Given a sequence of positive integers and another positive integer p. The sequence is said to be a perfect sequence if M≤m×p where M and mare the maximum and minimum numbers in the sequence, respectively.
Now given a sequence and a parameter p, you are supposed to find from the sequence as many numbers as possible to form a perfect subsequence.
Input Specification:
Each input file contains one test case. For each case, the first line contains two positive integers N and p, where N (≤105) is the number of integers in the sequence, and p (≤109) is the parameter. In the second line there are N positive integers, each is no greater than 109.
Output Specification:
For each test case, print in one line the maximum number of integers that can be chosen to form a perfect subsequence.
Sample Input:
10 8
2 3 20 4 5 1 6 7 8 9
Sample Output:
8
二、题目大意
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。。
三、考点
逻辑
四、注意
1、直接遍历会超时;
2、使用int会有一个点报错,要使用long long;
3、维护一个最长length,剪枝减小时间复杂度。
五、代码
#include<iostream>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
//read
long long int n, p;
cin >> n >> p;
vector<int> v(n);
for (int i = 0; i < n; ++i) {
scanf("%d", &v[i]);
}
//sort
sort(v.begin(), v.end());
//solve
//out of time
/*
int i;
bool flag = false;
for (i = 0; i < n; ++i) {
long long int a, b;
for (int j = 0; j <= i; ++j) {
a = v[j];
b = v[n - i + j - 1];
if (b <= a * p) {
flag = true;
break;
}
}
if (flag == true)
break;
}
*/
int result = 0;
for (int i = 0; i < n; ++i) {
for (int j = i + result; j < n; ++j) {
if (v[j] <= v[i] * p)
result = max(j - i + 1, result);
else
break;
}
}
//output
cout << result << endl;
system("pause");
return 0;
}