题目链接:1030 完美数列 (25 point(s))

给定一个正整数数列,和正整数 \(p\),设这个数列中的最大值是 \(M\),最小值是 \(m\),如果 \(M≤mp\),则称这个数列是完美数列。

现在给定参数 \(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

题解

如果用双层循环的话,肯定是会超时的。

需要先排序。再用滑动窗口(双指针)来解决此题。

不断移动右边界。然后用左边界向右移动不断试探。并记录最大值。

示例过程如下:

1、先升序排序

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

2、两个指针 \(left\) 和 \(right\) 指向第一个数据,最大长度 \(maxLen = 0\)

1 2 3 4 5 6 7 8 9 20
\(left\)
\(right\)

3、因为 \(1 * 8 > 1\),且 \(1 > maxLen\),所以 \(maxLen = 1\),\(right\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

4、因为 \(1 * 8 > 2\),且 \(2 > maxLen\),所以 \(maxLen = 2\),\(right\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

5、因为 \(1 * 8 > 3\),且 \(3 > maxLen\),所以 \(maxLen = 3\),\(right\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

6、因为 \(1 * 8 > 4\),且 \(4 > maxLen\),所以 \(maxLen = 4\),\(right\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

7、因为 \(1 * 8 > 5\),且 \(5 > maxLen\),所以 \(maxLen = 5\),\(right\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

8、因为 \(1 * 8 > 6\),且 \(6 > maxLen\),所以 \(maxLen = 6\),\(right\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

9、因为 \(1 * 8 > 7\),且 \(7 > maxLen\),所以 \(maxLen = 7\),\(right\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

10、因为 \(1 * 8 = 8\),且 \(8 > maxLen\),所以 \(maxLen = 8\),\(right\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

11、因为 \(1 * 8 < 9\),所以 \(left\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

12、因为 \(2 * 8 > 9\),\(right\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

13、因为 \(2 * 8 < 20\),\(left\) 右移

1 2 3 4 5 6 7 8 9 20
\(left\) \(right\)

14、因为 \(3 * 8 > 20\),\(right\) 右移,\(right = N\),所以结束,因此最终结果是 \(8\)

C代码

/*********************************************************************
Score: 25
Problem: 1030
Compiler: C(gcc)
Run Time: 25ms
Version: 1.2
Author: wowpH
Date: 2019-11-22 21:38:27
From: https://www.cnblogs.com/wowpH/p/11914428.html
*********************************************************************/
#include <stdio.h>
#include <stdlib.h> #define MAX_N 100000 long long arr[MAX_N];// 乘法会超过int型范围 int compare(const void* a, const void* b); int main(void) {
int N, p;
scanf("%d %d", &N, &p);
for (int i = 0; i < N; ++i) {
scanf("%lld", &arr[i]);
}
qsort(arr, N, sizeof(long long), compare);// 头文件stdlib.h
int left = 0;
int right = 0;
int maxLen = 0;
while (right < N) {
while (left < N && arr[left] * p < arr[right]) {// mp>=M
++left;
}
if (right - left + 1 > maxLen) {
maxLen = right - left + 1;
}
++right;
}
printf("%d\n", maxLen);
return 0;
} int compare(const void* a, const void* b) {
return *(int*)a - *(int*)b;// 升序
}

原文链接https://www.cnblogs.com/wowpH/p/11914428.html


- End - wowpH - cnblogs -

PAT(B) 1030 完美数列 - C语言 - 滑动窗口 & 双指针的更多相关文章

  1. PAT乙级 1030. 完美数列(25)

    1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...

  2. PAT 乙级1030 完美数列(25) C++版

    1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...

  3. PAT Basic 1030 完美数列 (25 分)

    给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...

  4. PAT (Basic Level) Practise (中文)-1030. 完美数列(25)

    PAT (Basic Level) Practise (中文)-1030. 完美数列(25)   http://www.patest.cn/contests/pat-b-practise/1030 给 ...

  5. PAT-乙级-1030. 完美数列(25)

    1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...

  6. P 1030 完美数列

    转跳点:

  7. PAT——1030. 完美数列

    给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...

  8. PAT 1030. 完美数列(25)

    给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...

  9. PAT (Basic Level) Practise:1030. 完美数列

    [题目链接] 给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一 ...

随机推荐

  1. kafka消费端提交offset的方式

    Kafka 提供了 3 种提交 offset 的方式 自动提交 复制 1234 consumer.commitSync(); 手动异步提交 offset 复制 1 consumer.commitAsy ...

  2. 【概率DP】$P2059$ 卡牌游戏

    链接 题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家 ...

  3. smartnic

    19年趋势: Intel® 2019网络技术研讨会圆满落幕 SANTOS: Flow and HQoS Acceleration Over DPDK Using Intel Programmable ...

  4. LCA的多种求法(超详细!!!)

    倍增求LCA (1)树上倍增法 预处理 设f[x,k]表示x的2^k辈祖先,即从x向根节点走2^k步到达的节点.特别地,若该节点不存在,则令f[x,k]=0.f[x,0]就是x的父节点.可以得出f[x ...

  5. git 初始用法

    Git global setup git config --global user.name "xiaoming" git config --global user.email & ...

  6. 简单与实用:SpringMVC的常见使用

    一.前言 现在的项目大多数都是使用SpringMVC作为MVC框架.SpringMVC的学习成本较低,容易上手,简单实用. 二.应用 1.@Controller & @RequestMappi ...

  7. 仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'TableName'中的标识列指定显式值

    当某表的一个列为自动增长列,是无法直接通过insert语句向给字段写入指定值,解决方法: SET IDENTITY_INSERT TABLE_NAME ON; INSERT INTO TABLE_NA ...

  8. SNF快速开发平台2019-权限管理模型-平台服务(多平台\多组织\SAAS\多系统)

    1.1    不同组织机构 通俗的讲,就是一个集团公司,划分几个区域,每个区域都有什么分公司,每个分公司都有哪些部门一样,哪些部门又有那些子部门等. 当然也可以是外贸公司的全球性客户.合作伙伴的分布情 ...

  9. odoo开发笔记 -- 提高访问安全性的一种方式

    场景描述: 最近在做项目的过程中,需要需要将odoo应用集成到其他系统中, 在对方的系统中点击我们的应用,打开对应系统,但是界面不做跳转,在当前页面打开,并且浏览器地址栏只显示IP+应用名,不让显示o ...

  10. ThinkPHP5远程代码执行高危漏洞(附:升级修复解决方法)

    漏洞描述 由于ThinkPHP5框架对控制器名没有进行足够的安全检测,导致在没有开启强制路由的情况下,黑客构造特定的请求,可直接GetWebShell. 漏洞评级 严重 影响版本 ThinkPHP 5 ...