Cod sursa(job #3327102)

Utilizator 0r0th0rnPiran Cosmin-Gabriel 0r0th0rn Data 2 decembrie 2025 11:31:56
Problema Transport Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

// Funcția care verifică dacă o capacitate dată este suficientă
// pentru a transporta saltelele în maxim K ture.
bool esteValid(long long capacitate, int n, int k, const vector<int>& volume) {
    int numarTransporturi = 1;
    long long incarcaturaCurenta = 0;

    for (int i = 0; i < n; i++) {
        if (incarcaturaCurenta + volume[i] <= capacitate) {
            // Putem adăuga salteaua în transportul curent
            incarcaturaCurenta += volume[i];
        }
        else {
            // Trebuie să facem un nou transport
            numarTransporturi++;
            incarcaturaCurenta = volume[i];
        }
    }

    return numarTransporturi <= k;
}

int main() {
    ifstream fin("transport.in");
    ofstream fout("transport.out");

    int n, k;
    fin >> n >> k;

    vector<int> volume(n);
    long long maxVol = 0;
    long long sumaTotala = 0;

    for (int i = 0; i < n; i++) {
        fin >> volume[i];
        // Calculăm limitele pentru căutarea binară
        if (volume[i] > maxVol) {
            maxVol = volume[i];
        }
        sumaTotala += volume[i];
    }

    // Intervalul de căutare
    long long stanga = maxVol;
    long long dreapta = sumaTotala;
    long long rezultat = sumaTotala;

    while (stanga <= dreapta) {
        long long mid = stanga + (dreapta - stanga) / 2;

        if (esteValid(mid, n, k, volume)) {
            // Capacitatea 'mid' este suficientă, încercăm să găsim una mai mică
            rezultat = mid;
            dreapta = mid - 1;
        }
        else {
            // Capacitatea 'mid' este prea mică (ne trebuie mai multe ture decât K)
            stanga = mid + 1;
        }
    }

    fout << rezultat;

    fin.close();
    fout.close();

    return 0;
}