二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列
模板如下
bool check(int x) // 检查x是否满足某种性质//模板一:最大值的最小值
int bsearch(int l, int r) {while (l < r) {int mid = l + r >> 1;// >> 1等价于除以2if (check(mid)) r = mid;else l = mid + 1;}return l;
}//模板二:最小值的最大值
int bsearch(int l, int r) {while (l < r) {int mid = l + r + 1 >> 1;// >> 1等价于除以2if (check(mid)) l = mid;else r = mid - 1;}return l;
}
例题
P1873
代码如下
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int m[1000010],a,b,t=0,ma=0;
bool asd(int x)
{int sum=0;for(int i=0;i<a;i++){sum+=max(t,m[i]-x);}//cout<<sum<<endl;if(sum>=b)return true;elsereturn false;
}
signed main()
{cin>>a>>b;for(int i=0;i<a;i++){cin>>m[i];ma=max(ma,m[i]);}int l=0,r=ma;while(l<r){//cout<<l<<" "<<r<<endl;int mid=(l+r+1)/2;if(asd(mid))l=mid;elser=mid-1;}cout<<l<<endl;return 0;
}
P2440
代码如下
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int m[1000010],a,b,t=0,ma=0;
bool asd(int x)
{int sum=0;for(int i=0;i<a;i++){sum+=m[i]/x;}if(sum>=b)return true;elsereturn false;
}
signed main()
{cin>>a>>b;for(int i=0;i<a;i++){cin>>m[i];ma=max(ma,m[i]);}int l=0,r=ma;while(l<r){//cout<<l<<" "<<r<<endl;int mid=(l+r+1)/2;if(asd(mid))l=mid;elser=mid-1;}cout<<l<<endl;return 0;
}
P2678
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
int m[1000010],a,b,t=0,ma=0,c;
bool asd(int x)
{int sum=0,i=0;for(int j=1;j<=b+1;j++){if(m[j]-m[i]<x){sum++;}elsei=j;}//cout<<x<<" "<<sum<<endl;if(sum<=c)return true;elsereturn false;
}
signed main()
{cin>>a>>b>>c;for(int i=1;i<=b;i++){cin>>m[i];}int l=0,r=a;m[b+1]=a;while(l<r){int mid=(l+r+1)/2;//cout<<mid<<endl;if(asd(mid))l=mid;elser=mid-1;}cout<<l<<endl;return 0;
}