UVA 714 二分最大化最小值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA 714 二分最大化最小值相关的知识,希望对你有一定的参考价值。

题意:输入t表示有多个样例,输入n,group表示有n个数分为group组使每组和最小

#include<iostream>  
#include<string.h>  
using namespace std;  
#define ll long long  
const int N = 500 + 5;  
ll a[N];  
int vis[N];  
ll num,m,group;  

int solve(int d)
{
    ll sum=0; int k=1;
    for(int i=0;i<num;i++)
    {
        if(a[i]+sum<=d)
            sum+=a[i];
        else
        {
            sum=a[i];
            k++;
        }
    }
    if(k<=group)
        return 1;
    else
        return 0;
}
void out()
{
    memset(vis,0,sizeof(vis));
    int k=1; ll sum=0;
    for(int i=num-1;i>=0;i--)
    {
        if(sum+a[i]<=m)
        {
            sum+=a[i];
        }
        else
        {
            k++;
            sum=a[i];
            vis[i]=1;
        }
    }
    for(int i=0;i<num&&k<group;i++)
    {
        if(!vis[i])
        {
            vis[i]=1; k++;
        }
    }
    for(int i=0;i<num-1;i++)
    {
        cout<<a[i]<<" ";
        if(vis[i])
            cout<<"/ ";
    }
    cout<<a[num-1]<<endl;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll sum=0;m=0;
        cin>>num>>group;
        for(int i=0;i<num;i++)
        {
            cin>>a[i];
            sum+=a[i];
            if(m<a[i])
                m=a[i];
        } 
        int mid=(m+sum)/2;
        while(sum>m)
        {
            if(solve(mid))
            {
                sum=mid;
            }
            else
                m=mid+1;
            mid=(sum+m)/2;
        }
    //    cout<<mid<<endl;
        out();
    }
    return 0;
 } 

 

以上是关于UVA 714 二分最大化最小值的主要内容,如果未能解决你的问题,请参考以下文章

UVa714 Copying Books (二分法,贪心)

UVA907 Winterim Backpacking Trip最大化最小值+二分

Stream My Contest UVA - 11865(带权最小树形图+二分最小值最大化)

UVA-11478 Halum二分差分约束

UVa12549 Sentry Robots (二分图最大匹配,最小点集覆盖)

uva 11419 (二分图最小覆盖)