Cod sursa(job #2178735)

Utilizator danyvsDan Castan danyvs Data 19 martie 2018 18:14:02
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>

using namespace std;

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

const int NMAX = 16005;

int vec[NMAX], n, k;

int main() {
    fin >> n >> k;
    int lo = 0, hi = 0;
    for (int i = 1; i <= n; ++ i) {
        fin >> vec[i];
        if (vec[i] > lo)
            lo = vec[i];
        hi += vec[i];
    }
    fin.close();

    int ans = NMAX * NMAX;
    /* se cauta binar valoarea ceruta, intre dimensiunea maxima a unei saltele (vor fi maxim n
    tranposturi) si suma saltelelor (va fi un transport) */
    while (lo <= hi) {
        int mid = lo + (hi - lo) / 2;

        int cnt = 1, qty = mid;
        bool ok = true;
        for (int i = 1; i <= n && ok; ++ i) {
            if (vec[i] > mid) {
                // exista o saltea cu dimensiunea mai mare decat a camionului
                ok = false;
            }
            else {
                if (vec[i] <= qty) {
                    // salteaua curenta se poate pune in camionul curent
                    qty -= vec[i];
                }
                else {
                    // trebuie un nou camion
                    ++ cnt;
                    qty = mid - vec[i];

                }
            }
        }

        if (ok && cnt <= k) {
            if (mid < ans)
                ans = mid;
            hi = mid - 1;
        }
        else
            lo = mid + 1;
    }

    fout << ans << "\n";

    fout.close();

    return 0;
}