Cod sursa(job #837412)

Utilizator Athena99Anghel Anca Athena99 Data 17 decembrie 2012 22:54:55
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>
#include <cassert>
#define dim 16005

int n=0,k=0,v[dim];

int check(int x)
{
    int p=0,i=0,as=0;

    for (i=0; i<n; ++i)
    {
        if (as+v[i]<x)
            as+=v[i];
        else
        {
            ++p;
            as=0;
        }

        if (i==n-1 && as<x)
            ++x;
    }

    if (p<k+1)
        return 1;
    else
        return 0;
}

int main()
{
    int answer=-1,sl=0,sd=0,mid=0,i=0,max=0;

    assert(freopen("transport.in","r",stdin));
    assert(freopen("transport.out","w",stdout));

    scanf("%d%d",&n,&k);
    for (i=0; i<n; ++i)
    {
        scanf("%d",&v[i]);
        sd+=v[i];
        max=(v[i]>max)?v[i]:max;
    }
    sl=max+1;

    while (sl<sd+1)
    {
        mid=(sl+sd)/2;
        if (check(mid)==1)
        {
            answer=mid;
            sd=mid-1;
        }
        else
            sl=mid+1;
    }
    printf("%d\n",answer);

    fclose(stdin);
    fclose(stdout);

    return 0;
}