现在的位置: 首页 > 综合 > 正文

最大值最小化

2013年08月14日 ⁄ 综合 ⁄ 共 972字 ⁄ 字号 评论关闭

贪心+二分入门题:

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

抱歉!评论已关闭.