B1030 完美数列 (25 分)
这是一道二分法的题目,许久不使用二分法,感觉有点生疏。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100000+5;
vector<int> vec;
int N,p;
int binarySearch(int i,long long x){
if(vec[N-1]<=x) return N;
int l=i+1,r=N-1,mid;
while(l<r){
mid=(l+r)/2;
if(vec[mid]<=x)l=mid+1;
else r=mid;
}
return l;
}
int main(){
scanf("%d %d",&N,&p);
for(int i=0;i<N;i++){
int x;
scanf("%d",&x);
vec.push_back(x);
}
//sort
sort(vec.begin(),vec.end());
int ans = 1;//max length=1
for(int i=0;i<N;i++){
//vec[i+1]~vec[n-1]
int j=binarySearch(i,(long long)vec[i]*p);
ans=max(ans,j-i);//update
}
printf("%d\n",ans);
return 0;
}
注意点:
- vec[i] x p,已经超出了int的范围,用long long。
- 二分的前提是先排序。
- 通过指针l与指针r不断地缩小搜索范围,指针mid当中介,当l与r相等时,查询结束。
以下,用c++提供的upper_bound函数解决,内部也采用二分实现。
#include<bits/stdc++.h>
using namespace std;
vector<int> vec;
int N,p;
int main(){
scanf("%d %d",&N,&p);
for(int i=0;i<N;i++){
int x;
scanf("%d",&x);
vec.push_back(x);
}
//sort
sort(vec.begin(),vec.end());
int ans = 1;//max length=1
for(int i=0;i<N;i++){
//vec[i+1]~vec[n-1]
int j=upper_bound(&vec[i+1],&vec[N],(long long)vec[i]*p)-&vec[0];
ans=max(ans,j-i);//update
}
printf("%d\n",ans);
return 0;
}
B1030 完美数列 (25 分)的更多相关文章
- PAT Basic 1030 完美数列 (25 分)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- 1030 完美数列 (25 分)C、Java、python
题目描述 给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完 ...
- PAT (Basic Level) Practice (中文)1030 完美数列 (25 分) (有点意思)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- 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 B1030 完美数列 (25 分)
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- 【算法笔记】B1030 完美数列(三种方法)
1030 完美数列 (25 分) 给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可 ...
- PAT 1030. 完美数列(25)
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列. 现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...
随机推荐
- 【待补充】[Linux] nc
[nc 是做什么的] [nc怎么用] 查看帮助 nc -help # 查看帮助 nc -help # 监听端口 -l, --listen Bind and listen for incoming co ...
- CentOS7 中安装 MySQL
0. 说明 参考 centos7.2安装MySQL CentOS 7 下 Yum 安装 MySQL 5.7 两种方式安装 MySQL 安装 MySQL(yum) & 安装 MySQL(yum) ...
- windows注册表
如何导入与导出注册表 进入注册表编辑器,选择“文件”“导出”命令,打开“导出注册表文件”对话框.选择保存位置并为其取名,单击保存即可完成注册表的备份. 打开注册表编辑器,选择“文件”“导入”命令,打开 ...
- Docker容器学习与分享02
1.docker容器的创建 首先运行一个centos容器,感受一下Docker容器的便捷 首先先看一下镜像仓库 发现仓库里没有镜像,也就是没有创建容器的模板,这时考虑从REPOSITORY中拉取镜像( ...
- vc获取当前进程CPU使用率
double GetCPUUserRate() { HANDLE hProcess=::GetCurrentProcess(); static DWORD s_dwTickCountOld = 0; ...
- POJ 3415 Common Substrings 【长度不小于 K 的公共子串的个数】
传送门:http://poj.org/problem?id=3415 题意:给定两个串,求长度不小于 k 的公共子串的个数 解题思路: 常用技巧,通过在中间添加特殊标记符连接两个串,把两个串的问题转换 ...
- 【FRM123】Wrong Way Risk
https://www.investopedia.com/articles/investing/102015/introduction-wrong-way-risk.asp https://www.r ...
- 关于checkbox自动选中
checkbox是比较常用的,无论是权限管理还是博客的文章的标签类型的勾选,或者是上下级部门及其公司,都会用的到的. 今天主要讲的是checkbox自动根据值选中. 可参考我之前的文章:checkbo ...
- leetcode70—Climbing Stairs
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- Linux中Shell
Linux中Shell Shell是什么 Shell是一个命令行解释器,为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,可以用Shell来启动.挂起.停止.编写一些程序. S ...