狂暴者 pat basic 练习三十 完美数列 测试点4超时,测试点五错误解决方法
心得:
找数时,尤其是大小关系的数,可以考虑将数组排序,这样有条理
排序后,前后两个数存在大小关系,可以适当跳跃式查找
题目:
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤105)是输入的正整数的个数,p(≤109)是给定的参数。第二行给出 N 个正整数,每个数不超过 109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
思路:
取出每一个数,然后乘以p,看看数组中有多少个数小于等于这个数的,得出最大值,输出即可
思路很简单,但是有很多细节问题
测试点5错误,题目中说p<=10^9,数组中的数最大也是10^9,虽然int可容纳10^9的数,但是他俩需要相乘,所以就会超出范围
解决办法是声明p为long long;
测试点4超时,刚开始想的时候肯定是两层循环,第一层遍历,第二层找符合条件的数,时间复杂度是O(n^2),作为25分的题肯定会超时,所以要优化:
1.现将数组排序,这样每次找都不必从头开始,
2.假如我们第一次算出完美数列个数为num个,那么算第二个数的时候直接从它后面第num个数开始算起,
如果其后面第num个数也符合条件,说明第二个数和第2+num个数之间的数都符合条件(因为都排好序了),以第二个数为起点的完美数列个数肯定是大于以第一个数为起点的完美数列个数的,此时将最大个数加1,
接下来的数以此类推,符合条件就将最大个数加1,不符合直接跳出,判断下一个数,从而优化了,结合代码更清晰
代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{ios::sync_with_stdio(false);int num,temp,max_count_num=1;//max_count_num初值为1,因为数列个数至少有一个long long p;//p要声明为long longvector<int> vec;cin>>num>>p;for(int i=0;i<num;i++){cin>>temp;vec.push_back(temp);}sort(vec.begin(),vec.end());//进行排序,方便下面操作for(int i=0;i<vec.size();i++){for(int j=i+max_count_num;j<vec.size();j++)//每次找数的时候直接从max_count_num开始{ if(vec.at(j)<=vec.at(i)*p)max_count_num++;//符合条件就加1else//否则就直接跳出不用找了,因为接下来的数肯定都不符合break;}}cout<<max_count_num<<endl;;return 0;
}
狂暴者 pat basic 练习三十 完美数列 测试点4超时,测试点五错误解决方法相关推荐
- 【PAT (Basic Level) 】1030 完美数列 (25 分)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. [输入 ...
- 第三十三期:对于人工智能的恐惧及其5个解决方法
实施人工智能技术的IT领导人可能会感到一些恐惧,这有着充分的理由.人工智能在拥有数十年发展和应用历史的同时却有着奇怪的定位,但对于许多人来说,人工智能仍然是一种未来主义的感觉. 实施人工智能技术的IT ...
- 狂暴者 pat basic 练习二十八 人口普查 测试点3格式错误
心得: 1.学习的时候要把以前的经验都牢记于心,比如"优先级不等比较法","字符串分割法" 2.结构体传参也是有传值和传址之分,和基本类型一样,不用指针传的是拷 ...
- 狂暴者 pat basic 练习二十六 程序运行时间
心得: 1.隐式类型转换有两种: (1)赋值语句 float a, int b=2; a=b;b自动升级(不过java输出a是2.0,而c++还是2) (2)算术表达式 float a, int b ...
- 狂暴者 pat basic 练习二十九 旧键盘
心得: 1.字符串每个字符是char类型 2.char类型可以认为是整数类型,和int一样,甚至97=='a'是对的,只不过char存数字的时候会有一个映射,将存的数字转换成对应的字符 3.转大小写有 ...
- 狂暴者 pat basic 练习二十五 反转链表
心得: 1.map还分为普通map和unordered_map,map需要根据key进行排序,而un不要,所以un更快一些 2.除了map.insert()方法能插入数据外,还有一种中括号赋值的方式更 ...
- 狂暴者 pat basic 练习二十四 科学计数法
心得: 对待问题时找规律,以分解的思想看问题 题目: 科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式 [+-][1-9].[0-9]+E[+-][0-9]+,即数字的整数 ...
- 狂暴者 pat basic 练习二十二 D进制的A+B 测试点2,3,4原因
心得: 在题目要求的数据大小接近int范围时(2^31-1),最好考虑不要用整型了,其实long的定义只要求不比int小,而现在基本上都是64位机,int和long都是4个字节的,所以long也不要用 ...
- 36.深度解密三十六:网络舆情监测之另类“免费监测”方法详解
网络营销推广技术.技巧深度解密(三十六)指南: 1.本文档适合零基础以及互联网营销推广工作者,主要讲解免费网络舆情监测的问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬畏法律 ...
最新文章
- 51CTO学院三周年-最受学员喜爱讲师评选大赛
- JS中map()与forEach()的用法
- pandas处理丢失数据与数据导入导出
- qt5变成内部头文件 ubuntu_Ubuntu下Visual Studio Code软件的安装和使用
- Codepen 每日精选(2018-4-21)
- 《『若水新闻』客户端开发教程》——16.添加广告
- 【数据仓库】数据仓库设计前如何粗估所需的存储空间大小?
- jQuery Easy UI 使用
- 【图像处理】高斯模糊、高斯函数、高斯核、高斯卷积操作
- 解读国密非对称加密算法SM2
- Stata:多元回归中控制其他因素不变的含义
- 拆解市面上卖几百上千的语聊挂机赚钱项目
- 如何判断用户是否关注微信订阅号,亲测实战步骤
- 微信添加表情提示过大怎么解决?GIF太大怎么变小?
- 马氏距离 (马哈拉诺比斯距离) (Mahalanobis distance)
- Python 转换金额数字大写为数字小写
- 高精算法推动高精地图落地
- druid连接池监控
- Android之MediaPlayer(两种)基本使用方式
- 程序员每天累成狗,是为了什么