二分例题 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 ...
随机推荐
- 【bzoj2049】[Sdoi2008]Cave 洞穴勘测——线段树上bfs求可撤销并查集
题面 2049: [Sdoi2008]Cave 洞穴勘测 Time Limit: 10 Sec Memory Limit: 259 MB Submit: 12030 Solved: 6024 Desc ...
- STL vector容器 和deque容器
前言 STL是C++的框架,然后vector容器和deque容器又是STL的一部分... 这块的内容都是理解.概念为主,没什么捷径,希望读者能静下来记. 先来讲vector容器(单端动态数组) 1.v ...
- 搭建SQL server AwaysOn集群
1.环境 系统:windows server 2012 R2 数据库版本:SQL server 2012 三台服务器,IP分别是:10.10.10.111,10.10.10.112,10.10.10. ...
- Python第十二章-多进程和多线程01-多进程
多进程和多线程 一.进程 1.1 进程的引入 现实生活中,有很多的场景中的事情是同时进行的,比如开车的时候 手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的:试想,如果把唱歌和跳舞这2件事情分开依次 ...
- 在MVC三层项目中如何使用Log4Net
--前期准备(添加到队列中) 0-1在新建后的MVC项目中的[Models]中添加一个类,用于处理异常信息,并继承自HandleErrorAttribute public class MyExcept ...
- A song for a new begining 8月26日到10月11日 第一阶段
- cat userlist
cat命令 Linux下的一个文本输出命令,通常用于观看某个文件的内容 功能: 1.一次显示整个文件 $ cat filename 2.从键盘创建一个文件 $ cat > filename 只能 ...
- Hadoop调试记录(2)
自从上次调通hbase后很久没有碰hadoop了,今日想写一个mapreduce的小程序.于是先运行了下自带的wordcount示例程序,却报错了. 信息如下: kevin@ubuntu:~/usr/ ...
- Chart控件的使用
1.开启滚动条(ScaleView.Size除以Interval ,大概是中间出现纵线的数量,一般动ScaleView.Size) chart1.ChartAreas[0].CursorX.AutoS ...
- bootstrip CSS
什么是网格(Grid)? 摘自维基百科: 在平面设计中,网格是一种由一系列用于组织内容的相交的直线(垂直的.水平的)组成的结构(通常是二维的).它广泛应用于打印设计中的设计布局和内容结构.在网页设计中 ...