PAT (Advanced Level) Practice 1085

本文介绍了一个算法问题“完美序列”,旨在从给定序列中找出满足特定条件的最大子序列长度。通过排序和二分查找的方法实现,具体步骤包括输入参数解析、序列排序、遍历序列并应用二分查找确定符合条件的最大子序列长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值