例题1

1010 只包含因子2 3 5的数

http://www.51nod.com/Challenge/Problem.html#problemId=1010

K的因子中只包含2 3 5。满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15。

所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数。

例如:n = 13,S中 >= 13的最小的数是15,所以输出15。

收起

 

输入

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10000)
第2 - T + 1行:每行1个数N(1 <= N <= 10^18)

输出

共T行,每行1个数,输出>= n的最小的只包含因子2 3 5的数。

输入样例

5
1
8
13
35
77

输出样例

2
8
15
36
80
题解 :这个题目用到二分,二分之前需要预处理一个数组
定理:K=2^x*3^y*5^z即k是只包含2,3,5,的因子的数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf =1e18+;//这里的范围要比1e8大1000左右
const int N=1E6+;
ll arr[N];
int pos=;
void inint(){
ll i, j, k;
for(i=;i<inf;i*=)
for(j=;j*i<inf;j*=)
for(k=;k*i*j<inf;k*=)
arr[pos++]=i*j*k;
}
int main(){
inint();
sort(arr,arr+pos);
int t;
scanf("%d",&t);
while(t--){
ll n;
cin>>n;
ll ans;
int left=;
int right=pos-;
while(left<=right){
int mid=(left+right)/;
if(arr[mid]>=n){
ans=arr[mid];
right=mid-;
}
else {
left=mid+;
}
}
cout<<ans<<endl;
} return ;
}

例题2

1267 4个数和为0

http://www.51nod.com/Challenge/Problem.html#problemId=1267

给出N个整数,你来判断一下是否能够选出4个数,他们的和为0,可以则输出"Yes",否则输出"No"。

收起

 

输入

第1行,1个数N,N为数组的长度(4 <= N <= 1000)
第2 - N + 1行:A[i](-10^9 <= A[i] <= 10^9)

输出

如果可以选出4个数,使得他们的和为0,则输出"Yes",否则输出"No"。

输入样例

5
-1
1
-5
2
4

输出样例

Yes
题解:要找4个数,这四个数的和为0,我们先确定好两个数,然后再二分查找另外两个数
#include<bits/stdc++.h>
using namespace std;
const int N=+;
int arr[N];
int main(){
int t;
cin>>t;
for(int i=;i<t;i++) scanf("%d",&arr[i]);
sort(arr,arr+t);
bool flag=false ;
for(int i=;i<t;i++){
for(int j=i+;j<t;j++){
for(int k=j+;k<t;k++){
int ans=arr[i]+arr[j]+arr[k];
int left=k+;
int right=t-;
while(left<=right){
int mid=(left+right)/;
if(arr[mid]+ans>){
right=mid-;
}
else if(arr[mid]+ans<){
left=left+;
}
else {
flag=true;
break;
}
}
if(flag) break;
}
if(flag) break;
}
if(flag) break;
}
if(flag) puts("Yes");
else puts("No");
return ;
}

例题3

1105 第K大的数

http://www.51nod.com/Challenge/Problem.html#problemId=1105

数组A和数组B,里面都有n个整数。

数组C共有n^2个整数,分别是:

A[0] * B[0],A[0] * B[1] ...... A[0] * B[n-1]

A[1] * B[0],A[1] * B[1] ...... A[1] * B[n-1]

......

A[n - 1] * B[0],A[n - 1] * B[1]  ......  A[n - 1] * B[n - 1]

是数组A同数组B的组合,求数组C中第K大的数。

例如:

A:1 2 3,B:2 3 4。

A与B组合成的C为

A[0]  A[1]  A[2]

B[0]     2      3      4

B[1]     4      6      8

B[2]     6      9     12

共9个数。

收起

 

输入

第1行:2个数N和K,中间用空格分隔。N为数组的长度,K对应第K大的数。(2 <= N <= 50000,1 <= K <= 10^9)
第2 - N + 1行:每行2个数,分别是A[i]和B[i]。(1 <= A[i],B[i] <= 10^9)

输出

输出第K大的数。

输入样例

3 2
1 2
2 3
3 4

输出样例

9
题解 二分套二分。传统的二分都是对排好序的数组的下标进行处理,这里不一样,我们二分的left为最小值,right为最大值,然后二分这个区间,同时判断大于mid的个数,当大于mid的个数为m-1时,就是答案。但是不一定是最优的答案,所以要继续增大,继续查找
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N= +;
ll arr1[N],arr2[N];
int n,m;
ll sum(ll x){
ll sum1=;
for(int i=;i<n;i++){
int left=;
ll ans=n;
int right=n-;
while(left<=right){
int mid=(left+right)/;
if(arr1[i]*arr2[mid]>x){
right=mid-;
ans=mid;
}
else {
left=mid+;
}
}
sum1+=n-ans;
}
return sum1;
}
int main(){
cin>>n>>m;
for(int i=;i<n;i++) scanf("%lld%lld",&arr1[i],&arr2[i]);
sort(arr1,arr1+n);
sort(arr2,arr2+n);
ll left=arr1[]*arr2[];
ll ans=;
ll right=(1ll*arr1[n-])*(1ll*arr2[n-]);
while(left<=right){
ll mid=(left+right)/;
ll x=sum(mid);
// if(x==m-1){
// ans=mid;
// right=mid-1;
// } //这里这样写有点不对,因为我们的sum函数只是保存了比mid大的数的个数,但是当出现两个相等的数时,比他们大的数的数目是一样的,但是这两个数的位置不一样,一个在前边,一个在后边
if(x<m){
ans=mid;
right=mid-;
}
else {
left=mid+;
}
}
cout<<ans<<endl;
return ;
}

二分例题 51nod的更多相关文章

  1. 整体二分例题:POI2011Meteors——Chemist

    题目地址:https://www.luogu.org/problemnew/show/P3527#sub 首先这个答案不是操作几次下了几场陨石雨之后的陨石个数,无法在线做,考虑离线做法.暴力的想法就是 ...

  2. 自然数幂和&伯努利数(Bernoulli)

    二项式定理求自然数幂和 由二项式定理展开得 \[ (n+1)^{k+1}-n^{k+1}=\binom {k+1}1n^k+\binom {k+1}2n^{k-1}+\cdots+\binom {k+ ...

  3. 51nod 1105 二分答案法标准题目

    二分答案法例题,用于练习二分答案的基本思想非常合适,包括了思维方式转换的内容(以前我们所做的一直是利用二分法求得数组元素对应指针之类,但是现在是直接对答案进行枚举). 思路是:首先对输入数组进行排序, ...

  4. 51nod 1105(第K大数 二分套二分)

    题目链接:http://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=620811 参考自:https://blog.csdn.net/f_ ...

  5. 51nod 1243 排船的问题(二分)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 题意: 思路: 二分来做,每次贪心的把船安排到能安排的最左边即可. ...

  6. 51nod 1640 MST+二分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 1640 天气晴朗的魔法 题目来源: 原创 基准时间限制:1 秒 ...

  7. ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  8. 51nod 1243 二分+贪心

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 1243 排船的问题 题目来源: Codility 基准时间限制: ...

  9. 51nod 1267 二分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267 1267 4个数和为0 基准时间限制:1 秒 空间限制:13107 ...

随机推荐

  1. [CVPR 2019]NOCS代码训练、检测与评估

    Normalized Object Coordinate Space for Category-Level 6D Object Pose and Size Estimation 训练.检测与评估 本文 ...

  2. Manjaro更新后 搜狗拼音输入法突然无法正常使用

    之前Manjaro已经用了很久了,很多该配置的都已经配置好了,但是搜狗拼音在系统更新后突然无法使用 1检查 如下依赖 2.检查配置文件 3.发现一切配置没问题,此时输入 sogou-qimpanel ...

  3. Jocke的IOT之路--raspberrypi更换国内镜像

    一.编辑sources.list文件 sudo nano /etc/apt/sources.list 使用#将文件内容全部注释调,更改位 deb http://mirrors.tuna.tsinghu ...

  4. VMware使用总结

    1.处理器设置释疑 比如一个8核16线程处理器 处理器数量最多设置为8,而每个处理器的内核数量*处理器个数必须小于等于16. 2.虚拟网络编辑器 NAT模式中可通过NAT设置将内部端口映射到主机端口. ...

  5. Nginx 简介与安装

    1,简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供俄 ...

  6. VSCode 快速生成 .vue 模版

    VSCode 快速生成 .vue 模版 安装vscode 官网:https://code.visualstudio.com/ 安装 Vetur 插件,识别 vue 文件 插件库中搜索Vetur,点击安 ...

  7. Fast Enumeration

    在 Objective-C 2.0 中提供了快速枚举的语法,它是我们遍历集合元素的首选方法.它具有以下优点: 比直接使用 NSEnumerator 更高效: 语法非常简洁: 如果集合在遍历的过程中被修 ...

  8. 《java编程思想》多态与接口

    向上转型 定义:把某个对象的引用视为对其基类类型的引用的做法被称为向上转型方法调用绑定 将一个方法调用同一个方法主体关联起来被称作绑定. 前期绑定:程序执行前进行的绑定叫做前期绑定,前期绑定也是jav ...

  9. CSS躬行记(2)——伪类和伪元素

    一.伪类选择器 伪选择器弥补了常规选择器的不足,能够实现一些特殊情况下的样式,例如在鼠标悬停时或只给字符串中的第一个字符指定样式.与类选择器类似,可以从HTML元素的class属性中查看到,但伪选择器 ...

  10. 7.Metasploit后渗透

    Metasploit 高阶之后渗透 01信息收集 应用场景: 后渗透的第一步,更多地了解靶机信息,为后续攻击做准备. 02进程迁移 应用场景: 如果反弹的meterpreter会话是对方打开了一个你预 ...