Cod sursa(job #1370776)

Utilizator Burbon13Burbon13 Burbon13 Data 3 martie 2015 17:06:44
Problema Transport Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <iostream>
#include <cstdio>

#define n_max 16005

using namespace std;

int n,v[n_max],k,S;

void citire()
{
    scanf( "%d %d" , &n , &k ) ;
    for ( int i = 1 ; i <= n ; i ++ )
        {
            scanf( "%d" , &v[i] ) ;
            S += v[i] ;
        }
}

int verif( int nr )
{
    int ant = 0 , ct = 0 , p = 1 , s  ;
    while ( p <= n )
    {
        s = 0 ;
        while ( p <= n && s + v[p] <= nr )
            s += v[p++] ;
        ant ++ ;
        if ( ant > k )
            return -1 ;
    }
    if ( ant == k )
        return 0 ;
    return 1 ;
}

void cautbin()
{
    int f = -1 ;
    if ( k == 1 )
    {
        printf( "%d\n" , v[n] ) ;
        return ;
    }
    int st , dr ;
    st = S / k ;
    if ( S % k )
        st ++ ;
    dr = S / ( k - 1 ) ;
    if ( S % ( k - 1 ) )
        dr ++ ;
    while ( st <= dr )
    {
        int m = st + ( dr - st ) / 2 ;
        int cond = verif(m) ;
        if ( cond == 0 )
        {
            f = m ;
            dr = m - 1 ;
        }
        else if ( cond == 1 )
            dr = m - 1 ;
        else
            st = m + 1 ;
    }
    printf( "%d\n" , f ) ;
}

int main()
{
    freopen( "transport.in" , "r" , stdin ) ;
    freopen( "transport.out" , "w" , stdout ) ;
    citire() ;
    cautbin() ;
    return 0;
}