Cod sursa(job #863648)

Utilizator stoicatheoFlirk Navok stoicatheo Data 23 ianuarie 2013 22:46:16
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 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)
        {
            ++p;
            as=0;
        }
        as=as+v[i];
    }
 
    if(as!=0)
        ++p;
    if(p>k)
        return 0;
    return 1;
}
 
int main()
{
    int answer=-1,sl=0,sd=0,mid=0,i=0;
 
    assert(freopen("transport.in","r",stdin));
    assert(freopen("transport.out","w",stdout));
 
    assert(scanf("%d%d",&n,&k));
    for (i=0; i<n; ++i)
    {
        scanf("%d",&v[i]);
        sd+=v[i];
        if (v[i]>sl)
            sl=v[i];
    }
 
    while (sl<sd+1)
    {
        mid=(sl+sd)>>1;
        if (check(mid)==1)
        {
            answer=mid;
            sd=mid-1;
        }
        else
            sl=mid+1;
    }
    assert(printf("%d\n",answer));
 
    fclose(stdin);
    fclose(stdout);
 
    return 0;
}