Author: CAO, Peng
Organization: 浙江大学
Time Limit: 200 ms
Memory Limit: 64 MB
Code Size Limit: 16 KB
B1030/A1085. 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 (<= 10^5) is the number of integers in the sequence, and p (<= 10^9) is the parameter. In the second line there are N positive integers, each is no greater than 10^9.
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
Code
//NKW 乙级真题1020
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int maxn = 100010;
long long d[maxn];
int main(){
int n, len = 1;
long long p;
scanf("%d %lld", &n, &p);
for (int i = 0; i < n; i++)
scanf("%lld", &d[i]);
sort(d, d + n);
for (int i = 0; i < n; i++)
len = max(len, (int)(upper_bound(d + i, d + n, d[i] * p) - d - i));
printf("%d\n", len);
return 0;
}
upper_bound(first,last,val),返回容器 [first,last) 内一个值大于val的元素的位置
two pointers法:
//NKW 乙级真题1020
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int maxn = 100010;
long long d[maxn];
int main(){
int n, len = 1;
long long p;
scanf("%d %lld", &n, &p);
for (int i = 0; i < n; i++)
scanf("%lld", &d[i]);
sort(d, d + n);
int i = 0, j = 0;
while (i < n&& j < n){
while (j < n&&d[j] <= (long long)d[i] * p){
len = max(len, j - i + 1);
j++;
}
i++;
}
printf("%d\n", len);
return 0;
}
Analysis
-给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mxp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。