二分例题 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 ...
随机推荐
- 李宏毅老师机器学习课程笔记_ML Lecture 1: ML Lecture 1: Regression - Demo
引言: 最近开始学习"机器学习",早就听说祖国宝岛的李宏毅老师的大名,一直没有时间看他的系列课程.今天听了一课,感觉非常棒,通俗易懂,而又能够抓住重点,中间还能加上一些很有趣的例子 ...
- vue基础指令学习
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Leetcode——二叉树常考算法整理
二叉树常考算法整理 希望通过写下来自己学习历程的方式帮助自己加深对知识的理解,也帮助其他人更好地学习,少走弯路.也欢迎大家来给我的Github的Leetcode算法项目点star呀~~ 二叉树常考算法 ...
- 决战Leetcode: easy part(51-96)
本博客是个人原创的针对leetcode上的problem的解法,所有solution都基本通过了leetcode的官方Judging,个别未通过的例外情况会在相应部分作特别说明. 欢迎互相交流! em ...
- Linux中cache和buff的区别
两者都是:缓冲区 cache是存在于cpu和内存之间的缓冲区,存放的是从disk上读取到的数据 buff是用于存放要输出到块存储的数据 清除缓冲的方法 [root@DD-Server-9F ~]# e ...
- PIGS POJ - 1149网络流(最短增广路---广搜) + 建图
题意: 第一行输入m和n,m是猪圈的数量,n是顾客的数量,下面n行 第 i+1行表示第i个顾客 , 输入第一个数字表示有几把猪圈的钥匙,后面输入对应的猪圈,最后一个数字输入顾客想买几头猪. 建图: 设 ...
- 转载:Docker源码分析(一):Docker架构
原文地址: http://www.infoq.com/cn/articles/docker-source-code-analysis-part1 作者:孙宏亮 1 背景 1.1 Docker简介 D ...
- 【tensorflow2.0】数据管道dataset
如果需要训练的数据大小不大,例如不到1G,那么可以直接全部读入内存中进行训练,这样一般效率最高. 但如果需要训练的数据很大,例如超过10G,无法一次载入内存,那么通常需要在训练的过程中分批逐渐读入. ...
- php设计模式总结
#1 使用设计模式(如建造者.外观.原型和模板模式)更快速.更有效地创建对象 #2 使用数据访问对象和代理设计模式分离体系结构 #3 使用委托.工厂和单元素设计模式改善代码流和控制 #4 在不修改对象 ...
- python 爬虫:学爬虫必学的正则表达式
文章更新于:2020-03-30 一.语法格式 1.非打印字符 操作符 说明 实例 \cx 匹配由x指明的控制字符 \cM 匹配一个 Control-M 或回车符.x 的值必须为 A-Z 或 a-z ...