最大值最小化

贪心+二分入门题:

 

#include <iostream>

#include<string.h>

#include<algorithm>

#include<cstdio>

#define CLR(arr,val) memset(arr,val,sizeof(arr))

using namespace std;

void in(int &a)

{

    char ch;

    while((ch=getchar())<'0'||ch>'9');

    for( a=0;ch>='0'&&ch<='9';ch=getchar()) a=a*10+ch-'0';



}

/*int d,x,y;

void extend_gcd(int a,int b,int& d,int& x,int& y)

{

    if(b==0)

    {

        d=a;

        x=1;

        y=0;

        return;

    }

   extend_gcd(b,a%b,d,x,y);

    int t=x-(a/b)*y;

        x=y;

        y=t;

}

int main()

{

    int a,b;

    while(cin>>a>>b)

    {

       extend_gcd(a,b,d,x,y);

       while(x<0) x+=b;

       cout<<x<<endl;

    }

    return 0;

}

*/

#define N 10005

int p[N],n,m,maxx,sum;

void input()

{

    maxx=-1,sum=0;

    for(int i=0;i<n;++i)

    {

        cin>>p[i];

        if(maxx<p[i]) maxx=p[i];

        sum+=p[i];

    }

}

bool _test(int  t)

{

    bool flag=true;

    int s=0,num=0;

    for(int i=0;i<n;++i)

    {

        if(p[i]>t)

        {

            flag=false;

            break;

        }

        if(s+p[i]>t)

        {

            s=p[i];

            num++;

            if(num>m-1)

            {

                flag=false;

                break;

            }



        }

        else

        {

            s+=p[i];

        }

    }

    return flag;

}

int bin_search()

{

    int l=maxx,r=sum;

    while(l<=r)

    {

        int mid=(l+r)>>1;

        if(_test(mid)) r=mid-1;

        else           l=mid+1;

    }

    return l;

}

int main()

{

    int T;

    cin>>T;

    while(T--)

    {

    cin>>n>>m;

    input();

    cout<<bin_search()<<endl;

    }

    return 0;

}


 

 

你可能感兴趣的:(值)