Cod sursa(job #2811741)

Utilizator constantin_tiberiuConstantin Tiberiu Zota constantin_tiberiu Data 3 decembrie 2021 00:06:42
Problema Transport Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <iostream>
using namespace std;

int N, K;  // N saltele, K transporturi
int saltele[16000];

bool incercare(int cap) {  // capacitatea minima a camionului
                           // returneaza true, daca pentru o anumita capacitate data
                           // se poate realiza problema
    int transporturi = 0, index = 0, volum;
    while (index < N) {  // indexul din stiva
        volum = 0;
        //if(saltele[index] > cap) return false; // daca exista o saltea care depaseste capacitatea camionului - nu mai e nevoie sa verific
        while (volum + saltele[index] <= cap) {
            volum += saltele[index++];
        }
        transporturi++;
        if (transporturi > K) return false;  // daca am depasit nr de transporturi permis
    }
    return true;  // daca totul a mers bine, intorc true
}

int verific(int p, int q) {
    // cout << p << " " << q << endl; // debug purpose
    if (p == q) return p;
    int cap = (p + q) / 2;
    if (incercare(cap))
        return verific(p, cap);  // incercam cu una mai mica
    else
        return verific(cap+1, q);  // trebuie una mai mare
}

int main() {
    ifstream fin("transport.in");
    ofstream fout("transport.out");
    fin >> N >> K;
    int cap_min = 0, cap_max = 0;
    int x;
    // cap_min va fi volumul celei mai mari saltele
    // cap_max va fi suma volumelor tuturor saltelelor
    for (int i = 0; i < N; i++) {
        fin >> x;
        if (x > cap_min) cap_min = x;
        cap_max += x;
        saltele[i] = x;
    }
    // cout << verific(cap_min, cap_max);  // debug purpose
    fout << verific(cap_min, cap_max);
    fin.close();
    fout.close();
    return 0;
}