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,设这个数列 ...
随机推荐
- C#.NET解析XML(使用属性控制 XML 序列化)
使用属性可以控制对象的 XML 序列化. 默认情况下,XML 元素名称由类或成员名称确定.在名为 Book 的简单类中,字段 ISBN 将生成 XML 元素标记 <ISBN>,如下面的示例 ...
- 分页插件 layui.laypage 的用法
参考 layui.laypage 官方文档 https://www.layui.com/demo/laypage.html 第一步下载插件 (注意不能只引入引入 layui.css和layui.js ...
- 「Luogu P3820 小D的地下温泉」
这道题的考点比较多. 前置芝士 BFS(DFS),这两种算法在这道题中并没有什么特别突出的地方,基本就是自己看心情写(本文以DFS为准,所以我心情是好是坏呢?) 连通块,可以将每一个温泉看作一个连通块 ...
- IOS导航器 + 表控制器 常用功能函数/属性
1. 设置标题栏(顶部)颜色 在表控制器中 e.g -(void)viewDidLoad中添加 self.navigationController.navigationBar.barTintColor ...
- P1075 链表元素分类
P1075 链表元素分类 转跳点:
- PE文件中找导出表
导出表: typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; // 未使用,总为0 DWORD TimeDateStamp; ...
- 在GNOME开发人员的努力下,Pango 1.44即将问世
早在5月份,Red Hat的Matthias Clasen共同制定了计划,在近年来相当陈旧的情况下,对Pango布局引擎库进行了一些改进. 这项工作将随着Pango1.44版本的发布而实现,看起来它很 ...
- dubbo-admin的安装使用
dubbo-admin下载地址:https://github.com/apache/incubator-dubbo/releases 可以直接下载到linux上 wget https://github ...
- nodejs配置 https服务
const port = normalizePort(process.env.PORT || '3000'); const path = require('path'); const https = ...
- Windows下使用Tomcat
tomcat简介 Tomcat是一个开源.免费.轻量级的web服务器,只支持部分JavaEE规范(Servlet.JSP),适合部署中小型.并发访问量不大的web项目,是部署中小型Java Web项目 ...