Cod sursa(job #895595)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 27 februarie 2013 11:55:12
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
FILE *f=fopen("transport.in","r");
FILE *g=fopen("transport.out","w");

int n,k,v[16001];
int maxi(int v[16001],int &sum)
{
    int i,max=-1;
    for(i = 1; i <= n; i ++)
        {
            if(v[i]>max)
                max=v[i];
            sum+=v[i];
        }
    return max;
}
int okay(int x)
{
    int times=1,i,semi=0;
    for(i=1;i<=n;i++)
    {
        if(semi+v[i]<=x)
            semi+=v[i];
        else
            {times++;semi=0;i--;}
    }
    return times;
}
int cauta(int x1,int x2)
{
    int li,lf,m;
    li=x1;
    lf=x2;
    while(li<=lf)
    {
        m=(li+lf)/2;
        if(okay(m)<k)
            lf=m-1;
        else
            if(okay(m)>k)
                li=m+1;
            else
                if(okay(m)==k)
                    lf=m-1;

    }
    if (okay(m) > k) ++m;
    return m;
}
int main()
{
    fscanf(f,"%d%d",&n,&k);
    int i,x,sum=0,y;
    for(i = 1; i <= n; i ++)
        fscanf(f,"%d",&v[i]);
    x = maxi(v,sum);
    y=cauta(x,sum);
    fprintf(g,"%d",y);
    return 0;
}