Cod sursa(job #122457)

Utilizator TabaraTabara Mihai Tabara Data 12 ianuarie 2008 14:42:52
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <stdio.h>

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

int n, MAXIM, _poz, 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;
    MAXIM = 0;
    for ( i = 1; i <= n; ++i )
    {
        scanf( "%d", &VOL[i] );
        if ( VOL[i] > MAXIM ) MAXIM = VOL[i];
    }
    
    //cautarea binara
    st = 1; 
    dr = (MAXIM<<17);    
    
    while ( st <= dr )
    {
          mij = ((st+dr)>>1);
          if ( Ok(mij) ) dr = mij-1;
          else st = mij+1;
    }
    printf( "%d\n", st );
    
    
    /*
    int bl = 1,br = MAXIM, bm;
    while ( br - bl > 1 )
    {
          bm = (br+bl)>>1;
          if ( Ok( bm ) ) bl = bm;
          else             br = bm;
    }
    printf( "%d\n", bl );     */
    
    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];
    }
    if ( suma <= C ) 
    {
         count++;
         suma = 0;//nu mai trebuie
    }
    else if ( suma > C )
    {
         int x = (suma/C + 1);
         count += x;
    }
    if ( count <= K ) return 1;
    return 0;
}