Cod sursa(job #122473)

Utilizator TabaraTabara Mihai Tabara Data 12 ianuarie 2008 15:32:48
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
/*100 puncte
//Atentie la smecheria din functia Ok()
*/

#include <stdio.h>

#define in "transport.in"
#define out "transport.out"
#define NMAX 16003

int n, MAXIM, count, K;
int VOL[NMAX];
int st, dr, mij;

int Ok( int C );

int main()
{
    freopen( in, "r", stdin );
    freopen( out, "w", stdout );
    
    scanf( "%d%d", &n, &K );
    int i;
    for ( i = 1; i <= n; ++i )
    {
        scanf( "%d", &VOL[i] );
        MAXIM += VOL[i];
    }
    //cautarea binara
    st = 1; 
    dr = MAXIM;
    
    while ( st <= dr )
    {
          mij = ((st+dr)>>1);
          if ( Ok(mij) ) dr = mij-1;
          else st = mij+1;
    }
    printf( "%d\n", st );
    return 0;
}

int Ok( int C )
{
    int suma = 0;
    int i;
    count = 0;
    suma = VOL[1];
    for ( i = 2; i <= n; ++i )
    {
        if ( (suma + VOL[i]) > C )
        {
             count++;
             suma = VOL[i];
        }
        else suma += VOL[i];
    }
    /*
    Discutie:
    In suma nu pot fi retinute decat ultimele i elemente 
    */
    if ( suma <= C ) 
    {
         count++;//ramasita de transportat se incadreaza intr-un drum
    }    
    else
    {
        count = K+1;
    }        
    if ( count <= K ) return 1;
    return 0;
}