Pagini recente » Istoria paginii utilizator/andreicoravu | Cod sursa (job #1574281) | Monitorul de evaluare | Statistici Dimitriu Bogdan (bog287) | Cod sursa (job #2017147)
#include <stdio.h>
#define NMAX 16000
#define SALTEA_MAX 256000000
#define INFINIT 256000000
int stiva [ NMAX ] ;
int N, K, min, min2 ;
char testare (int cap ) {
int i, s, transport ;
s = 0 ;
transport = 0 ;
i = 0 ;
while (i < N && 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 && s > 0 ) { /// Ultimele saltele
transport++;
s = 0 ;
}
if (transport <= K && stiva[i] <= cap ) { /// Daca am facut mai putin de k transporturi
if (cap < min2 ) {
min = transport ;
min2 = cap ;
}
return 0 ; /// In care parte mergem
}
return 1 ;
}
void caut_bin (int st, int dr ) {
/// Cautam binar capacitatea
int pivot ;
pivot = (st + dr ) / 2 ;
if (st < dr-1 ) {
if (testare(pivot) == 0 ) /// 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 ;
}