1085 Perfect Sequence (25 分)
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 m are 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
一,关注点
1,i从0开始推进是没错的,但是j每次都从N-1开始推进,无形中使时间复杂度变成O(N^2),若是数组长度达到10^5会超时。正确方法是i和j都从0开始推进,由于数组是递增的,所以i和j都只会扫描一次数组,使得时间复杂度大大降低。
2,要注意arr[i]*p会超过int的表示范围。
二,超时解法
#include<cstdio>
#include<algorithm>
using namespace std;
const int max_n = 100100;
int arr[max_n];
bool cmp(int a, int b) {
return a < b;
}
int main() {
int N = 0, p = 0;
int ans = 0;
scanf("%d %d", &N, &p);
for (int i = 0; i < N; i++) {
scanf("%d", &arr[i]);
}
sort(arr, arr + N, cmp);
for (int i = 0; i < N; i++) {
long long temp = (long long)arr[i] * p;
if (N - i > ans) {
for (int j = N - 1; j >= i; j--) {
if (arr[j] <= temp) {
ans = max(ans, j - i + 1);
break;
}
}
}
else {
break;
}
}
printf("%d", ans);
return 0;
}
三,正确解法
#include<cstdio>
#include<algorithm>
using namespace std;
const int max_n = 100100;
int arr[max_n];
bool cmp(int a, int b) {
return a < b;
}
int main() {
int N = 0, p = 0;
int ans = 0;
scanf("%d %d", &N, &p);
for (int i = 0; i < N; i++) {
scanf("%d", &arr[i]);
}
sort(arr, arr + N, cmp);
int i = 0, j = 0, count = 1;
while (i < N) {
while (j < N&&arr[j] <= (long long)arr[i] * p) {
count = max(count, j - i + 1);
j++;
}
i++;
}
printf("%d", count);
return 0;
}