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;
}

典型的关键字:最大值最小(或最小值最大).

 

posted @ 2019-05-11 16:02  逆天峰  阅读(467)  评论(0编辑  收藏  举报
作者:逆天峰
出处:https://www.cnblogs.com/gcfer//