二分例题 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 ...
随机推荐
- 洛谷1514 引水入域 dp+记忆化搜索
题目链接:https://www.luogu.com.cn/problem/P1514 题意大致是:给定一个(n,m)的数值矩阵,可以在第一行建造水库,如果一个格子周围的某格子值小于它,那水就可以流到 ...
- Chrome EC框架探索_0.0_引言
0.0 引言 嵌入式硬件抽象框架常常面临着这样的尴尬:封装层次较高的(arduino,mbed)不能充分暴露必要的API并面临着性能问题,封装层次较低的(HAL,LL)接口复杂且开发困难.近日发现的一 ...
- [二分]codeforces 274A k-Multiple Free Set
k-Multiple Free Set time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- mysql-8.0.19-winx64下载
mysql-8.0.19-winx64 下载链接 提取码:m7qp
- TortoiseGit 与 Putty 配置冲突导致 Server refuse our key
tortoisegit是TortoiseSVN的Git版本,tortoisegit用于迁移TortoiseSVN到TortoiseGit,一直以来Git在Windows平台没有好用GUI客户端,现在t ...
- Transformers 中使用 TorchScript | 四
作者|huggingface 编译|VK 来源|Github 注意:这是我们使用TorchScript进行实验的开始,我们仍在探索可变输入大小模型的功能.它是我们关注的焦点,我们将在即将发布的版本中加 ...
- python文件调用方法
文件输入输出 open函数可以对文本文件进行读写的操作 基本形式: open(filename,mode) filename是文件名,可以写为绝对路径也可以是相对路径 mode是打开模式. open函 ...
- HTTP 请求状态码
200 请求成功 304 从缓存中读取 302 + 响应头中定义location: 重定向 // 自定义重定向 @RequestMapping("/customRedirecti ...
- IOS 手动添加第三方库报错问题
当不想使用CocoaPods来管理和使用第三方库的时候,就需要手动添加和配置这些第三方库,难免会出现一些问题,主要问题汇总如下: 1.AFNetworking.NKNetWork.ZxingObjC等 ...
- 文件输入输出实例&Ptask的编写
前言 最近在写Ptask,顺便了解了如何进行文件读入输出.而在Ptask中最重要,也是最最容易出bug的地方就是文件操作.那么如何进行文件输入输出,在程序中起到重要作用呢? 输入 首先为了保证可以在控 ...