二分例题 51nod
例题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
收起
输入
第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的更多相关文章
- 整体二分例题:POI2011Meteors——Chemist
题目地址:https://www.luogu.org/problemnew/show/P3527#sub 首先这个答案不是操作几次下了几场陨石雨之后的陨石个数,无法在线做,考虑离线做法.暴力的想法就是 ...
- 自然数幂和&伯努利数(Bernoulli)
二项式定理求自然数幂和 由二项式定理展开得 \[ (n+1)^{k+1}-n^{k+1}=\binom {k+1}1n^k+\binom {k+1}2n^{k-1}+\cdots+\binom {k+ ...
- 51nod 1105 二分答案法标准题目
二分答案法例题,用于练习二分答案的基本思想非常合适,包括了思维方式转换的内容(以前我们所做的一直是利用二分法求得数组元素对应指针之类,但是现在是直接对答案进行枚举). 思路是:首先对输入数组进行排序, ...
- 51nod 1105(第K大数 二分套二分)
题目链接:http://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=620811 参考自:https://blog.csdn.net/f_ ...
- 51nod 1243 排船的问题(二分)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 题意: 思路: 二分来做,每次贪心的把船安排到能安排的最左边即可. ...
- 51nod 1640 MST+二分
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1640 1640 天气晴朗的魔法 题目来源: 原创 基准时间限制:1 秒 ...
- ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)
http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...
- 51nod 1243 二分+贪心
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243 1243 排船的问题 题目来源: Codility 基准时间限制: ...
- 51nod 1267 二分
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1267 1267 4个数和为0 基准时间限制:1 秒 空间限制:13107 ...
随机推荐
- 面试刷题17:线程两次start()会发生什么?
线程是并发编程的基础元素,是系统调度的最小单元,现代的jvm直接对应了内核线程.为了降低并发编程的门槛,go语言引入了协程. 你好,我是李福春,我在准备面试,今天的题目是? 一个线程两次调用start ...
- 如何将一篇文章导入Endnote并将引用插入Word
Endnote作为一款专注管理文献引用的工具用起来还是很方便的,极大地简化了管理引用格式等相关工作,让我们能够把更多精力用在写文章本身. 今天就介绍一下如何将一篇我们看到的觉得有参考价值的文章导入wo ...
- MySQL笔记(9)-- 各种锁及实现
一.背景 MySQL有两种类型的锁:lock(锁)和latch(闩锁): 类型 lock latch 对象 事务 线程 保护 数据库内容 内存数据结构 持续时间 整个事务 临界资源 模式 行锁.表锁. ...
- 如何利用python实现为每行添加行数编号
可能还有更好的方法,在这里我是这么写的,针对小文件可以,但是如果文件内容太多,这种方法感觉不太好 先把所有的数据读取出来,然后利用W覆盖写入模式打开文件进行写入 遍历枚举类型数据后,默认是从0开始,然 ...
- 非常诡异的IIS下由配置文件加上svg的mime头导致整个网站的静态文件访问报错误
调试了两天遇到一个非常诡异的问题 一个系统稳定运行了很多年,是用mvc5+WIN2008R2 + .NET 4.5 +IIS环境下运行,非常稳定,最近想迁移到一台新的服务器,为了少麻烦在阿里云上买了 ...
- Java 对象容器
一.ArrayList 容器 1.记事本 package booknote; import java.util.ArrayList; public class NoteBook { private A ...
- 发现钉钉打卡定位算法的一个bug
最近公司取消了指纹打卡,改用钉钉打卡. 天天用这个打卡上班,经常忘记,困扰. 最烦的是好几次明明人在办公室,打卡地址显示在10分钟前的位置,定位失败,不得不重新打卡. 经历过几次定位失败后,我就琢磨起 ...
- B - Bound Found POJ - 2566(尺取 + 对区间和的绝对值
B - Bound Found POJ - 2566 Signals of most probably extra-terrestrial origin have been received and ...
- C++STL(二)——vector容器
STL--vector容器 vector对象的概念 vector基本操作 vector对象的初始化.赋值 vector查找.替换(已在上一片 string类 博客总结过了,不再总结) vector添加 ...
- python编程学习路线及笔记
话不多说,直接上图! 关于人工智能算法学习思路,欢迎浏览我的另一篇随笔:如果你想开始学习算法,不妨先了解人工智能有哪些方向? 之后博主将持续分享各大算法的学习思路和学习笔记:hello world: ...