P 1030 完美数列
转跳点:
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列。
现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数 N 和 p,其中 N(≤)是输入的正整数的个数,p(≤)是给定的参数。第二行给出 N 个正整数,每个数不超过 1。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
这道题一开始我理解错了题意,觉得可以先排序,然后得到最大的数,然后计数在它前面有多少个数乘p大于等于它,这样只会在一个测试点得到WA,但是这还是过不了啊。后来,我才发现会有次大值大于最大值的完美数列……
我AC的思路是:
先对数组先进行排序,以样例为例子,排序完后,顺序为:1,2,3,4,5,6,7,8,9,20;
那么选择array[0]为最小数,乘P,那么可以取的num的可以为1,2,3,4,5,6,7,8。一共有8个;
假如进行第二次遍历,从array[1]开始,那么可以选择便有2,3,4,5,6,7,8,9,共有8个。
我们只需要这样遍历便可以得到最长的完美数列。
但是要注意优化遍历,样例点4数据极其庞大,容易超时,
咱们第一遍跑的时候,1->8,停止,第二遍跑不进行优化的话又从0开始,这次多了个9 ,这一看就是一个O(N^2)的算法,而且重复很明显,1->8明显重复了n次,9重复了1次。
所以我们可以设置一个变量保存下每一次j最后一次的下标,供给下一次i循环使用,来减少重复。
代码实现如下:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #define MAXSIZE 100005
4 #define MAX(a, b) ((a) > (b) ? (a) : (b)) //最大值的宏内联函数
5 int cmp(void const *a, void const *b) { return (*(long *)a) > (*(long *)b) ? 1 : -1; }
6
7 int main(void)
8 {
9 int num = 0;
10 long size, P;
11 long array[MAXSIZE];
12
13 scanf("%ld %ld", &size, &P);
14
15 for (int i = 0; i < size; i++)
16 {
17 scanf("%ld", &array[i]);
18 }
19 //升序
20 qsort(array, size, sizeof(array[0]), cmp);
21
22
23 int cnt = 0;
24 for (int i = 0; i < size; i++)
25 {
26 int j = cnt; //将前面算过的数全部屏蔽掉
27 while (j++ < size)
28 {
29 if (array[j] > array[i] * P)
30 {
31 break;
32 }
33 }
34 num = MAX(num, j - i - 1);
35 cnt = j;
36 }
37
38 printf("%d\n", num);
39
40 return 0;
41 }
C++代码在Github上自行转跳
PTA不易,诸君共勉!
P 1030 完美数列的更多相关文章
- PAT乙级 1030. 完美数列(25)
1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...
- PAT-乙级-1030. 完美数列(25)
1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...
- PAT 乙级1030 完美数列(25) C++版
1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...
- PAT (Basic Level) Practise (中文)-1030. 完美数列(25)
PAT (Basic Level) Practise (中文)-1030. 完美数列(25) http://www.patest.cn/contests/pat-b-practise/1030 给 ...
- PAT(B) 1030 完美数列 - C语言 - 滑动窗口 & 双指针
题目链接:1030 完美数列 (25 point(s)) 给定一个正整数数列,和正整数 \(p\),设这个数列中的最大值是 \(M\),最小值是 \(m\),如果 \(M≤mp\),则称这个数列是完美 ...
- PAT——1030. 完美数列
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...
- PAT 1030. 完美数列(25)
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...
- PAT (Basic Level) Practise:1030. 完美数列
[题目链接] 给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一 ...
- PAT 1030 完美数列
https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224 给定一个正整数数列,和正整数 p,设这个数列 ...
随机推荐
- 通过CrawlSpider对招聘网站进行整站爬取(拉勾网实战)
爬虫首先要明确自己要爬取的网站以及内容 进入拉勾网的网站然后看看想要爬取什么内容职位,薪资,城市,经验要求学历要求,全职或者兼职职位诱惑,职位描述提取公司的名称 以及 在拉勾网的url等等 然后在na ...
- 前端学习笔记系列一:3 Vue中的nextTick
一.示例 先来一个示例了解下关于Vue中的DOM更新以及nextTick的作用. 模板 <div class="app"> <div ref="msgD ...
- P1063 计算谱半径
P1063 计算谱半径 转跳点:
- P1077 互评成绩计算
P1077 互评成绩计算 转跳点:
- 使用JMX连接JVM
什么是JMX? 什么是JMX,Java Management Extensions,即Java管理扩展,是一个为应用程序.设备.系统等植入管理功能的框架.JMX可以跨越一系列异构操作系统平台.系统体系 ...
- vue使用videojs控制后台m3u8数据请求
关于Video.js的使用方法就不再说了,有兴趣的请迁跃:https://videojs.com/ VideoJS中并没有stop之类控制后台数据请求的参数,只有暂停 video.pause()方法 ...
- imp.load_source的用法
imp.load_source(name,pathname[,file])的作用把源文件pathname导入到name模块中,name可以是自定义的名字或者内置的模块名称. 假设在路径E:/Code/ ...
- 013.Delphi插件之QPlugins,模块化代码示例
这个DEMO的是一个定义了一个窗体插件接口,把其他窗口注册到这个窗体插件接口中.主程序运行起来,就遍历一下窗体插件接口,把每个窗体内嵌到对话框中 运行效果如下 主窗口代码如下 unit Frm_Mai ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-music
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- DevOps - 优势
章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...