Cod sursa(job #1310860)

Utilizator nytr0gennytr0gen nytr0gen Data 7 ianuarie 2015 12:27:50
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int N_MAX = 16000;

int verif(int *v, int v_len, int capacitate) {
    int suma = 0, transporturi = 1;
    for (int i = 0; i < v_len; i++) {
        if (suma + v[i] > capacitate) {
            //printf("suma: %d .. %d\n", suma, transporturi);
            transporturi++;
            suma = 0;
        }
        suma += v[i];
    }
    printf("%d %d\n", transporturi, capacitate);

    return transporturi;
}

int main() {
    freopen("transport.in", "r", stdin);
    freopen("transport.out", "w", stdout);

    int N, K;
    scanf("%d%d", &N, &K);

    int v[N_MAX], max_vol = 0, total = 0;
    for (int i = 0; i < N; i++) {
        scanf("%d", &v[i]);
        max_vol = max(v[i], max_vol);
        total += v[i];
    }

    int pas = 1 << 30, poz = 0;
    int min_poz = pas;
    while (pas >>= 1) {
        if (pas + poz <= total - max_vol) {
            int test =  verif(v, N, pas + poz + max_vol);
            if (test > K)
                poz += pas;
            else if (test == K && pas + poz < min_poz)
                min_poz = pas + poz;
        }
    }

    printf("%d", max_vol + min_poz);
    //printf("\n%d\n", verif(v, N, 8));

    return 0;
}