PAT Basic 完美数列(25) [two pointers]
题目
给定⼀个正整数数列,和正整数p,设这个数列中的最⼤值是M,最⼩值是m,如果M <= m * p,则称这个数列是完美数列。现在给定参数p和⼀些正整数,请你从中选择尽可能多的数构成⼀个完美数列。
输⼊格式:
输⼊第⼀⾏给出两个正整数N和p,其中N(<= 10^5)是输⼊的正整数的个数,p(<= 10^9)是给定的参数。第⼆⾏给出N个正整数,每个数不超过109。
输出格式:
在⼀⾏中输出最多可以选择多少个数可以⽤它们组成⼀个完美数列。
输⼊样例:
10 8
2 3 20 4 5 1 6 7 8 9
输出样例:
8
题目分析
已知正整数序列seq[N],最大值为M,最小值为m,已知另一个正整数p(<=10^9),从数列中抽出一部分数字,求可以满足M<=m*p的数字最多抽取个数
要满足M<=mp抽取的数字最多(即:M与m中间夹的数字最多),需要取所有满足M<=mp的情况中,m最小,M最大
解题思路
思路 01(最优、二分查找、查找M复杂度O(logn))
- 对seq[N]升序排序
- 依次遍历seq[i],在i+1到N之间,找到最大满足M<=mp的数字(即:第一个满足大于mp的数字下标j-1)
思路 02 (two pointer、查找M复杂度O(n))
- 对seq[N]升序排序
- 依次遍历seq[i],j初始为0,开始从上次j往后找(因为i+1后m增大,m*q>=M,所以M增大,j只能在上次j之后)
易错点
- p(<=10^9),所以m*p有可能超过int范围,数组元素类型需为long long,否则第5个测试点错误
- 取第一个大于mp的数字下标-1,而不是第一个大于等于mp的数字下标(因为大于的情况下要-1,等于的情况下不需要-1,处理麻烦)
- 思路02中,只能从前往后找第一个不满足条件m*q>=M的,不能从后往前找最后一个满足条件的(测试点4超时)
Code
Code 01
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc,char * argv[]) {
int n,p;
scanf("%d %d",&n,&p);
long long seq[n]= {0}; // 若为int,第5个测试点错误
for(int i=0; i<n; i++) {
scanf("%d",&seq[i]);
}
sort(seq,seq+n);
int maxnum=0;
for(int i=0; i<n; i++) {
// 二分查找
int left=i+1,right=n;
int mid = left+((right-left)>>1);
while(left<right) {
mid = left+((right-left)>>1);
if(seq[mid]>seq[i]*p) { //若是求第一个大于等于seq[i]*p,测试点2错误
right=mid;
} else {
left=mid+1;
}
}
if(right-i>maxnum)maxnum=right-i;
}
printf("%d",maxnum);
return 0;
}
Code 01
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int main(int argc,char * argv[]) {
int n,p;
scanf("%d %d",&n,&p);
long long seq[n]= {0}; // 若为int,第5个测试点错误
for(int i=0; i<n; i++) {
scanf("%d",&seq[i]);
}
sort(seq,seq+n);
// 写法一:
int maxnum=0,j = 0;
for(int i=0; i<n; i++) {
while(j<n&&seq[i]*p>=seq[j]) j++;
maxnum=max(maxnum,j-i);
}
// 写法二:
// int i=0,j=0,maxnum=1;
// while(i<n&&j<n) {
// while(j<n&&seq[j]<=(long long)seq[i]*p) {
// maxnum=max(maxnum,j-i+1);
// j++;
// }
// i++;
// }
/*
使用下面代码,第四个测试点超时
j从后往前找最后一个满足条件的,测试点4超时
*/
// int maxnum=0,prej=0; //prej用于记录上次j的位置,之后的j只可能比prej大,m*p>=M;i+1因为m增大了,所以M一定增大
// for(int i=0; i<n; i++) {
// int j = n-1;
// while(prej<=j&&seq[i]*p<seq[j]) j--;
// maxnum=max(maxnum,j-i+1);
// prej=j;
// }
printf("%d",maxnum);
return 0;
}
PAT Basic 完美数列(25) [two pointers]的更多相关文章
- PAT 1030. 完美数列(25)
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数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,设这 ...
- PAT 乙级1030 完美数列(25) C++版
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 Basic 1030 完美数列 (25 分)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- PAT (Basic Level) Practice (中文)1030 完美数列 (25 分) (有点意思)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- PAT B1030 完美数列 (25 分)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- 牛客网PAT练兵场-完美数列
题目地址:https://www.nowcoder.com/pat/6/problem/4056 题解:先将a数组进行排序,第一次按题意M<=n*p;n=a[0]时,M最大为J(如下图),然后n ...
随机推荐
- Power BI角色控制
Case:企业的数据分析报表经常需要进行权限控制,根据读者的部门或职位,决定他可以看到的数据.例如,A部门的人只能查看A部门的数据,B部门的人只能查看B部门的数据,而领导层则可以看到所有的数据. 1, ...
- Essay写作的五大陷阱如何避免?
相信ESSAY写作对留学生来说印象非常深刻,由于国外不同的教育模式,老师动不动就是一篇essay.可是在大家都拥有相同的GMAT或者GPA以及雅思分数的情况下.大家如何才能够脱颖而出呢?下面BayDu ...
- (22)Canny算法
基础知识,主要是看这个博客:https://blog.csdn.net/qq_41167777/article/details/84863351
- Python 打开文件(File Open)
版权所有,未经许可,禁止转载 章节 Python 介绍 Python 开发环境搭建 Python 语法 Python 变量 Python 数值类型 Python 类型转换 Python 字符串(Str ...
- bash 内嵌命令 printf 用于进制转换
printf - 格式化并显示数据 printf "%d" 0x10 printf "%x" 16
- 【Android】家庭记账本手机版开发报告五
一.说在前面 昨天 1.添加菜单(查询.清除所有等)2.使用滑动删除 今天 1.创建登入和注册界面 2.向数据库添加一张用户表 问题 做完后在登入时有bug(未解决) 二.界面的搭建 1 ...
- CSS实现背景图片透明和文字不透明效果
1.毛玻璃效果:背景图 + 伪类 + flite:blur(3px) width: 500px; height: 300px; line-height: 50px; text-align: cente ...
- Kali桥接模式下配置静态ip
以管理员身份运行虚拟机 打开控制面板-->网络和Internet-->更改适配器 再在虚拟机处桥接到这个WLAN2 点击 编辑-->编辑虚拟网卡 没有网卡就点上图的添加网络作为桥接网 ...
- cf 478D.Santa Claus and a Palindrome
原来set,priority_queue也可以映射..涨姿势2333 比较麻烦的应该就是判断自身回文的串是选2个还是选一个吧. #include<bits/stdc++.h> #defin ...
- 翻译小工具制作,Python简单破解有道JS加密!
写这篇文章之前,我记得我以前好像公布一次.百度翻译的接口把版本号修改可以得到老版本,而老版本是没JS加密的,有道的呢也是一样的. ! 不过今天的教程不会这么low,咱们今天就老老实实把有道翻译的JS破 ...