Cod sursa(job #967110)

Utilizator andreea_zahariaAndreea Zaharia andreea_zaharia Data 27 iunie 2013 10:05:50
Problema Transport Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>

int v[16001];
int n, k;

int nr_trans(int capacitate)
{
    int i, cnt=0, crt=0;

    for(i=1; i<=n; i++)
    {
        if(crt+v[i]<=capacitate)
            crt+=v[i];
        else
        {
            crt=v[i];
            cnt++;
            if(cnt>k)
                return 1;
        }
    }

    return 0;
}

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

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

    int i, max=0, suma=0;

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

        max=(max<v[i])? v[i]:max;

        suma+=v[i];
    }

    int stanga, dreapta, mijloc, ult_elem, nr;

    stanga=max;
    dreapta=suma+1;
    ult_elem=suma;

    while(stanga<dreapta)
    {
        mijloc=(stanga+dreapta)/2;

        nr=nr_trans(mijloc);

        if(nr==0)
        {
            dreapta=mijloc-1;
            ult_elem=mijloc;
        }
        else
            stanga=mijloc+1;
    }

    printf("%d\n", ult_elem);

    return 0;
}