Pagini recente » Cod sursa (job #1127361) | Cod sursa (job #501143) | Cod sursa (job #2062754) | Cod sursa (job #1255634) | Cod sursa (job #1498579)
#include <stdio.h>
#define MAXN 16000
short v[16000];
short sim ( int n, int nr ) {
int i;
short nt = 0; /// nr. transporturi
int acc = 0; /// acumulatorul
for ( i = 0; i < n; i++ ) {
acc += v[i];
if ( acc > nr ) { /// overflow
nt++;
acc = v[i]; /// scad ce am dus
}
}
if ( acc > 0 ) /// mai imi ramane un transport
nt++;
//printf("nr de transporturi %d pentru cap %d\n", nt, nr );
return nt;
}
int main () {
FILE *fin, *fout;
fin = fopen ( "transport.in", "r" );
fout = fopen ( "transport.out", "w" );
int n, k;
fscanf( fin, "%d%d", &n, &k );
int i, max = -1, s = 0;
for ( i = 0; i < n; i++ ) {
fscanf( fin, "%hd", &v[i] );
s += v[i];
if ( max < v[i] )
max = v[i];
}
//printf("s = %hd, max = %hd\n", s, max );
int st = max, dr = s, mij, min = dr;
while ( st <= dr ) {
mij = ( st + dr ) / 2;
if ( sim ( n, mij ) <= k ) {
dr = mij - 1;
min = mij;
}
else
st = mij + 1;
}
fprintf( fout, "%d\n", min );
fclose ( fin );
fclose ( fout );
return 0;
}