PAT(B) 1030 完美数列 - C语言 - 滑动窗口 & 双指针
给定一个正整数数列,和正整数 \(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语言 - 滑动窗口 & 双指针的更多相关文章
- 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 1030 完美数列 (25 分)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- PAT (Basic Level) Practise (中文)-1030. 完美数列(25)
PAT (Basic Level) Practise (中文)-1030. 完美数列(25) http://www.patest.cn/contests/pat-b-practise/1030 给 ...
- PAT-乙级-1030. 完美数列(25)
1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...
- P 1030 完美数列
转跳点:
- 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和一些正整数,请你从中选择尽可能多的数构成一 ...
随机推荐
- 彻底理解C++指针
目录 目录 1 1. 概念 1 1.1. 双指针 1 1.2. 指针数组 1 1.3. 数组指针 1 1.4. 常见指针定义解读 1 2. 区别 2 3. 兼容性 2 4. 为何列数须相等? 2 5. ...
- Android Studio 之 ViewModel
ViewModel 是 JetPack 类库中的一个功能,可以保存控件的状态 ,在整个Activity 生命周期中,状态不会失效 如屏幕翻转时,状态可保留,不会失效! 与 LiveData 配合使用! ...
- Centos7 U盘安装&命令大全
软件下载 1.centos下载,下载地址https://www.centos.org/download/ 我选择的镜像是:CentOS-7-x86_64-DVD-1804.iso 2.UltraISO ...
- IIS基本设置、回收机制、性能、并发、安全性
通常把站点发布到IIS上运行正常后,很少会去考虑IIS提供的各种参数,如何配置才是最适合当前站点运行需要的?这篇文章,从基本设置.回收机制.性能.并发.安全性等IIS设置讲解应当如何优化. 先来“II ...
- 分析WordPress数据表之评论表(功能篇)
数据表分析 wp_comments(评论表) 该表字段,如下:comment_ID(评论ID)comment_post_ID(评论文章ID)comment_author(评论者用户名)comment_ ...
- 灵活的MyBatis
一.前言 将数据存储到数据库是开发中很重要的一环.曾经有程序员说自己做过最牛逼的事情就是增删改查.确实我们做了很多页面,后太代码写了很多,可是最终都离不开数据库的增删改查.Java有一套自己的JPA标 ...
- JavaScript Date对象和函数 (一)
JavaScript_Date对象说明 Date中文为"日期"的意思,Date继承自Object对象,此对象提供操作,显示日期与时间的函数 Date对象构造函数 Date对象具有 ...
- 线程:Java中wait、notify、notifyAll使用详解
基础知识 首先我们需要知道,这几个都是Object对象的方法.换言之,Java中所有的对象都有这些方法. public final native void notify(); public final ...
- Tomcat 9 管理界面配置
Tomcat9 在conf/tomcat_user.xml配置后,还是出现如下错误 然后修改tomcat9/webapps/manager/META-INF的context.xml文件
- android --------System.err: java.net.UnknownServiceException: CLEARTEXT .....
1,当调用远程接口进行网络通信时,报如下错误: W/System.err: java.net.UnknownServiceException: CLEARTEXT communication to 1 ...