zoukankan      html  css  js  c++  java
  • 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;
    }

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

  • 相关阅读:
    day07_final
    day06_final
    day02_final
    day04_final
    New
    AtCoder Grand Contest 015 E Mr.Aoki Incubator
    长链剖分学习笔记
    关于某些莫队的优化
    CodePlus 2019 3月月赛 Div.1 A题 TREE
    边分治学习笔记
  • 原文地址:https://www.cnblogs.com/gcfer/p/10848768.html
Copyright © 2011-2022 走看看