Pagini recente » Cod sursa (job #1026483) | Cod sursa (job #2979447) | Cod sursa (job #2585448) | Cod sursa (job #1181872) | Cod sursa (job #1772965)
#include <stdio.h>
#include <iso646.h>
#include <ctype.h>
#define NMAX 16000
#define SALTEA_MAX 16000
#define INFINIT 9000000
int stiva [ NMAX ] ;
int N, K, min, min2 ;
char testare (int cap ) {
int i, s, transport ;
s = 0 ;
transport = 0 ;
for (i = 0 ; i < N and stiva[i] <= cap ; ) {
/// Inseram saltele pana cand nu mai incap
if (s + stiva[i] <= cap ) {
s += stiva[i] ;
i++;
}
else {
if (s > 0 ) { /// Le transportam
transport++;
s = 0 ;
}
}
}
if (s <= cap ) { /// Ultimele saltele
transport++;
s = 0 ;
}
if (transport <= K and stiva[i] <= cap ) { /// Daca am facut mai putin de k transporturi
if (cap < min2 ) {
min = transport ;
min2 = cap ;
}
return 1 ; /// In care parte mergem
}
return 2 ;
}
void caut_bin (int st, int dr ) {
/// Cautam binar capacitatea
int pivot ;
pivot = (st + dr ) / 2 ;
if (st < dr-1 ) {
if (testare(pivot) == 1 ) { /// Testam sa vedem daca e minima
caut_bin(st, pivot ) ;
}
else {
caut_bin(pivot, dr ) ;
}
}
}
int main() {
FILE *fin, *fout ;
fin = fopen ("transport.in", "r" ) ;
fout = fopen ("transport.out", "w" ) ;
int i ;
min = INFINIT ;
min2 = INFINIT ;
fscanf (fin, "%d%d", &N, &K ) ;
for (i = 0 ; i < N ; i++ ) {
fscanf (fin, "%d", &stiva[i] ) ;
}
caut_bin(1, SALTEA_MAX + 1 ) ;
fprintf (fout, "%d", min2 ) ;
return 0 ;
}