PAT (Advanced Level) Practice 1085

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 (≤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

 题意是要从序列里面找到最大能满足max <= min * p的数的个数,因此方法就是对序列进行排序,然后从i开始遍历整个序列,假设arr[i]为min求出min * p,通过二分查找的方式找到最小大于min * p的角标index,然后根据index - i就是当前符合的元素个数,通过maxx = max(maxx, index - i);记录最大即可

#include
#include
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;
} 

 

你可能感兴趣的:(PAT_甲)