PAT甲级真题 1085 Perfect Sequence (25分) C++实现(排序、双指针,注意测试点5坑)

题目

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

思路

所求序列是最大、最小数的商小于等于p的最长的那段。

将数组排序,用i、j分别指向头尾,若符合要求则不断右移j,记录最大范围m;

若不符合要求则右移i,重新搜索,找到比m更大的话替换m;

当剩余元素数 n - i < m 时搜索结束(即使全都符合也不会比之前的m更长了)。


唯一需要注意的坑点是,做 a[j] <= a[i] * p 比较时,右边最大为1018会溢出int的范围,解决方法是用long long类型存放数组元素的值即可:vector a(n);

否则测试点5无法通过。

代码

#include 
#include 
#include 
using namespace std;
int main(){
    int n, p;
    cin >> n >> p;
    vector<long long> a(n);
    for (int i=0; i<n; i++){
        cin >> a[i];
    }
    sort(a.begin(), a.end());
    int m = 0;
    int i = 0;
    int j = 0;
    while (n - i > m){
        while (a[j]<=a[i]*p && j<n){
            j++;
        }
        if (j - i > m){
            m = j - i;
        }
        i++;
    }
    cout << m << endl;
    return 0;
}

你可能感兴趣的:(PAT)