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×pwhere 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
题意是要从序列里面找到最大能满足max <= min * p的数的个数,因此方法就是对序列进行排序,然后从i开始遍历整个序列,假设arr[i]为min求出min * p,通过二分查找的方式找到最小大于min * p的角标index,然后根据index - i就是当前符合的元素个数,通过maxx = max(maxx, index - i);记录最大即可
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
#define N 100010
ll arr[N];
int binarySearch(int l, int r, ll v){
while(l <= r){
int mid = (l + r) >> 1;
if(v >= arr[mid]){
l = mid + 1;
}else{
r = mid - 1;
}
}
return l;
}
int main(){
int n, p;
scanf("%d %d", &n, &p);
for(int i = 0;i < n;i++){
scanf("%d", &arr[i]);
}
sort(arr, arr + n);
int maxx = 0;
for(int i = 0;i < n;i++){
ll v = arr[i] * p;
int index = binarySearch(i, n - 1, v);
maxx = max(maxx, index - i);
}
printf("%d", maxx);
return 0;
}