PTA(Basic Level)1030.完美数列

Posted martinlwx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PTA(Basic Level)1030.完美数列相关的知识,希望对你有一定的参考价值。

给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤*m**p*,则称这个数列是完美数列。

现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。

输入格式:

输入第一行给出两个正整数 Np,其中 N(≤105)是输入的正整数的个数,p(≤109)是给定的参数。第二行给出 N 个正整数,每个数不超过 109。

输出格式:

在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。

输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
思路
  • 比较朴素的想法是:二重循环枚举数列(排序后),注意优化就不会TLE
  • 还有注意运算范围显然超过了int的上限,所以要使用long long
代码
#include<bits/stdc++.h>
using namespace std;
int a[100100];
int main()

    int N;
    long long p;
    scanf("%d%ld", &N, &p);
    for(int i=0;i<N;i++)
        scanf("%d", &a[i]);
    sort(a, a+N);

    int ans = 0;
    for(int i=0;i<N;i++)
    
        for(int j=i+ans;j<N;j++)   //这里j从i+ans开始找是一个很重要的优化,因为数组是有序的,我们这么找只要找让答案最长的数列就好了
        
            if(a[j] <= a[i] * p)
                ans = max(ans, j-i+1);
            else break;
        
    
    printf("%d\n", ans);
    return 0;

引用

https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224

以上是关于PTA(Basic Level)1030.完美数列的主要内容,如果未能解决你的问题,请参考以下文章

PAT Basic 1030 完美数列 (25 分)

PAT Basic 1030

1030 完美数列 (25分)

PAT 1030. 完美数列

1030 完美数列

1030 完美数列 (25 分)