0x04
二分:
while(l<r) { int mid=(l+r)/2; if(符合条件) r=mid; else l=mid+1; }
固定下二分的写法:
终止条件:l==r;
取mid=(l+r)/2;
if(mid符合条件) r=mid;
else l=mid+1;
也就是说这里把mid左边.
二分答案:
1:有n个书,每本书有其厚度,分成连续m组,求分成厚度的最大的一组的最小厚度?
#include<bits/stdc++.h> using namespace std; int n,a[100],m,maxx=0,minn=INT_MAX; bool check(int x) { int cnt=1,ans=0; for(int i=1;i<=n;i++) { if(ans+a[i]<=x) ans+=a[i]; else cnt++,ans=a[i]; } if(cnt<=m) return true; else return false; } int erfen() { int l=minn,r=maxx; while(l<r) { int mid=(l+r)/2; if(check(mid)) r=mid; else l=mid+1; } return l; } int main() { freopen("1.in","r",stdin); cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i],maxx+=a[i],minn=min(minn,a[i]); cout<<erfen()<<endl; }
典型的关键字:最大值最小(或最小值最大).