Pagini recente » Cod sursa (job #3367840) | Cod sursa (job #3364678) | Cod sursa (job #3367727) | Cod sursa (job #3368027) | Cod sursa (job #3367885)
#include <stdio.h>
#define VMAX 16000
int v[VMAX];
int verifica(int n, int k, long long capacitate) {
int transporturi, i, posibil;
long long curent;
transporturi = 1;
curent = 0;
posibil = 1;
for (i = 0; i < n; i++) {
if (v[i] > capacitate) {
posibil = 0;
}
if (curent + v[i] <= capacitate) {
curent = curent + v[i];
} else {
transporturi = transporturi + 1;
curent = v[i];
}
}
if (posibil == 0) {
return 0;
}
return transporturi <= k;
}
int gaseste_capacitate(int n, int k, int max_saltea, long long suma_totala) {
long long st, dr, mij, rez;
st = max_saltea;
dr = suma_totala;
rez = dr;
while (st <= dr) {
mij = (st + dr) / 2;
if (verifica(n, k, mij)) {
rez = mij;
dr = mij - 1;
} else {
st = mij + 1;
}
}
return rez;
}
int main() {
FILE *fin, *fout;
fin = fopen("transport1.in", "r");
int n, k, i, max_saltea, rezultat;
long long suma_totala;
max_saltea = 0;
suma_totala = 0;
fscanf(fin, "%d %d", &n, &k);
for (i = 0; i < n; i++) {
fscanf(fin, "%d", &v[i]);
suma_totala = suma_totala + v[i];
if (v[i] > max_saltea) {
max_saltea = v[i];
}
}
fclose(fin);
fout = fopen("transport1.out", "w");
rezultat = gaseste_capacitate(n, k, max_saltea, suma_totala);
fprintf(fout, "%d\n", rezultat);
fclose(fout);
return 0;
}