Pagini recente » Cod sursa (job #43736) | Cod sursa (job #1929520) | Cod sursa (job #2232641) | Cod sursa (job #510165) | Cod sursa (job #122473)
Cod sursa(job #122473)
/*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;
}