【PAT甲级 - C++题解】1085 Perfect Sequence

简介: 【PAT甲级 - C++题解】1085 Perfect Sequence

1085 Perfect Sequence


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


题意

给定一个正整数序列和常量 p ,假设一个序列的最小值为 m 以及最大值为 M ,那么当 m*p>=M 时,该序列为完美序列,现在需要我们找到给定序列中完美子序列的元素最大个数。


思路

具体思路如下:


1.存入每个元素,并对这些元素进行升序排序。

2.使用双指针进行完美子序列的查找,其中 i 表示上界即最大值,j 表示下界即最小值,然后用 for 循环从小到大遍历 i ,每趟遍历中 j 再从 0 开始递增,直至不满足 a[j]*p<a[i] 。计算当前序列个数 i-j+1 ,如果大于当前存储的答案 res ,则更新 res 。

3.输出答案 res 。


代码

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
int n, p;
int main()
{
    scanf("%d%d", &n, &p);
    for (int i = 0; i < n; i++)    scanf("%d", &a[i]);
    //对数组进行排序
    sort(a, a + n);
    //双指针计算计算范围
    int res = 0;
    for (int i = 0, j = 0; i < n; i++)
    {
        while ((long long)a[j] * p < a[i])  j++;
        res = max(res, i - j + 1);
    }
    cout << res << endl;
    return 0;
}
目录
相关文章
|
C++
【PAT甲级 - C++题解】1040 Longest Symmetric String
【PAT甲级 - C++题解】1040 Longest Symmetric String
66 0
|
算法 C++
【PAT甲级 - C++题解】1044 Shopping in Mars
【PAT甲级 - C++题解】1044 Shopping in Mars
82 0
|
C++
【PAT甲级 - C++题解】1117 Eddington Number
【PAT甲级 - C++题解】1117 Eddington Number
76 0
|
存储 C++ 容器
【PAT甲级 - C++题解】1057 Stack
【PAT甲级 - C++题解】1057 Stack
76 0
|
存储 C++
【PAT甲级 - C++题解】1055 The World‘s Richest
【PAT甲级 - C++题解】1055 The World‘s Richest
78 0
|
C++
【PAT甲级 - C++题解】1051 Pop Sequence
【PAT甲级 - C++题解】1051 Pop Sequence
79 0
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
30 4
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4
|
30天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4
|
30天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
23 4