1030 完美数列

Posted gzu_zb

tags:

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

一、题目

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

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

输入格式:

输入第一行给出两个正整数N和p,其中N(<= 10^5^)是输入的正整数的个数,p(<= 10^9^)是给定的参数。第二行给出N个正整数,每个数不超过10^9^。

输出格式:

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

输入样例:

10 8
2 3 20 4 5 1 6 7 8 9

输出样例:

8

二、题解

在做本题目时,第一次提交的时候,第4,5个测试点不能通过。首先,第5个测试点不通过的原因是开始定义了int型,当做乘法M <= m * p的时候会超过它的范围,所以应该用long long.

另外,第四个测试点一直超时的原因是算法的时间复杂度太高,刚开始的时候,我想到了用vector里的erase函数,可是不管从第一个开始删除,还是从大到小排序后删除最后一个元素,一样的会超时,那是因为在用vector里的erase函数的时候,增加了时间的复杂度,最后,才想到了用一个变量直接处理,不满足条件直接减一1!

注意:本题我的思路是从前往后比,在从后往前比。再对两次所得的结果进行判断。

 

三、代码

 1 #include<iostream>
 2 #include<math.h>
 3 #include<algorithm>
 4 #include<vector>
 5 using namespace std;
 6 
 7 bool cmp(const int &a, const int &b){
 8     return a > b;
 9 }
10 
11 int main(){
12     long long N, p;
13     cin >> N >> p;
14     vector<long long>v;
15     for (int i = 0; i < N; i++){
16         long long x;
17         cin >> x;
18         v.push_back(x);
19     }
20 
21     sort(v.begin(), v.end(), cmp);
22     long long M = v[0];
23     int len1=v.size();
24     for(int i=0;i<len1;i++){
25         long long m = v[len1-1];
26         if (sqrt(M) <= sqrt(m)*sqrt(p)) break;
27         else len1--;
28     }
29 
30     sort(v.begin(), v.end());
31     long long m = v[0];
32     int len2=v.size();
33     for(int i=0;i<len2;i++){
34         long long M = v[len2-1];
35         if (sqrt(M) <= sqrt(m)*sqrt(p)) break;
36         else len2--;
37     }
38 
39     cout<<(len1>len2?len1:len2);//输出较大的一个
40     return 0;
41 }

 



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

1030 完美数列 (25分)

PAT乙级1030

PAT 1030. 完美数列

1030 完美数列

PTA乙级 (*1030 完美数列 (25分))

1030 完美数列 (25 分)