Cod sursa(job #3367885)

Utilizator Barbu_DariusBarbu Darius Barbu_Darius Data 11 octombrie 2026 18:18:10
Problema Transport Scor 0
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#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;
}