算法与数据结构-二分
二分在C++ STL中可以直接使用,lower_bound 与 upper_bound 函数。lower_bound 代表在有序数组中找到第一个大与等于键值的位置,
而upper_bound代表第一个大于键值的位置,不过并不是所有与二分有关的可以用这两个函数。
在手动写二分时,主要要注意的是L R和左右边界。以下面的例题为例(BZOJ1816),
先要考虑二分的区间的边界到底是左开右闭还是左闭右开,这要根据mid的情况来决定,与此同时,答案也要在L与R中选择。
1 #include<iostream> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 const int inf=1000000000; 6 int n,m,c[55]; 7 bool C(int x){ 8 int t=min(x,m); 9 for (int i=1; i<=n; i++) { 10 if (x>c[i]) t-=(x-c[i]); 11 if (t<0) return false; 12 } 13 return true; 14 } 15 int main(){ 16 ios::sync_with_stdio(false); 17 cin>> n >> m; 18 for (int i=1; i<=n; i++) cin>>c[i]; 19 int l=0,r=inf+1,mid; 20 while (l+1<r) { 21 mid=(l + r)>>1; 22 if (C(mid)) l=mid; 23 else r=mid; 24 } 25 cout<<l<<endl; 26 return 0; 27 }