算法与数据结构-二分

二分在C++ STL中可以直接使用,lower_bound upper_bound 函数。lower_bound 代表在有序数组中找到第一个大与等于键值的位置,

upper_bound代表第一个大于键值的位置,不过并不是所有与二分有关的可以用这两个函数。

在手动写二分时,主要要注意的是L R和左右边界。以下面的例题为例(BZOJ1816)

先要考虑二分的区间的边界到底是左开右闭还是左闭右开,这要根据mid的情况来决定,与此同时,答案也要在LR中选择。

 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 }

 

posted @ 2019-03-18 16:43  MoerBlack  阅读(134)  评论(0编辑  收藏  举报