Cod sursa(job #283481)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 19 martie 2009 10:57:50
Problema Transport Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>
#define FIN "transport.in"
#define FOUT "transport.out"
#define N 16010

int n, k, sum, v[N], c;

void read()
{
    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    scanf("%d %d", &n, &k);

    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &v[i]);
        sum += v[i];
    }
}

int calc(int x)
{
    int s = 0, t = 0;
    for (int i = 1; i <= n; ++i)
    {
        if (s + v[i] > x)
        {
            ++t;
            s = 0;
        }
        s += v[i];
    }
    return t + 1;
}

void binarysearch()
{
    int p, u = sum, m, x;

    p = (sum % k) ? sum / k + 1 : sum / k;

    while (p < u)
    {
        m = (p + u) / 2;
        x = calc(m);
        if (x < k)
        {
            c = m;
            u = m - 1;
        }
        else if (x > k)
            p = m;
        else
            p = u = c = m;
    }
    while (calc(p - 1) <= k)
        -- p;
    c = p;
}

int main()
{
    read();

    binarysearch();

    printf("%d\n", c);
}