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 完美数列的主要内容,如果未能解决你的问题,请参考以下文章