Cod sursa(job #1493588)

Utilizator tudorcomanTudor Coman tudorcoman Data 29 septembrie 2015 17:39:36
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb

#include <stdio.h>
#include <assert.h>
#include <algorithm>
using namespace std;

const char *in = "transport.in";
const char *out = "transport.out";

const int maxN = 16e3;
int v[maxN], N, K, S, ans, M;

bool ok(int C) {
    int tmin = 1, c;
    c = v[0];

    for(register int i = 1; i < N; ++ i) {
        if(c + v[i] <= C)
            c += v[i];
        else {
            c = v[i];
            ++ tmin;
        }
    }

    return tmin <= K;
}

void caut(int st, int dr) {
    while(st <= dr) {
        int mid = (st + dr) >> 1;
        if(ok(mid)) {
            ans = mid;
            dr = mid - 1;
        } else
            st = mid + 1;
    }
}

int main() {
    assert(freopen(in, "r", stdin));
    assert(freopen(out, "w", stdout));
    scanf("%d %d", &N, &K);

    for(register int i = 0; i < N; ++ i)
        scanf("%d", &v[i]), S += v[i], M = max(M, v[i]);

    caut(M, S);
    printf("%d\n", ans);
    return 0;
}