Cod sursa(job #762066)

Utilizator gabrielvGabriel Vanca gabrielv Data 28 iunie 2012 15:52:21
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<cstdio>
#define NMAX 16010
#define maxim(a,b) ((a>b)?(a):(b))
#define oo (1<<30)

using namespace std;

int N,K,Sval,Vmax,a[NMAX];

void citire()
{
    freopen("transport.in","r",stdin);
    scanf("%d %d",&N,&K);
    Vmax=-oo;
    for(int i=1;i<=N;i++)
    {
        scanf("%d",&a[i]);
        Vmax=maxim(Vmax,a[i]);
        Sval+=a[i];
    }
}

bool verif(int SUM)
{
    int i,kk=1,s=0;
    for(i=1;i<=N && kk<=K;i++)
    {
        if(s+a[i]>SUM)
            s=a[i],kk++;
        else
            s+=a[i];
    }
    if(kk>K)
        return false;
    return true;
}

int search()
{
    int step,i;
    for(step=1;step<Sval;step<<=1);
    for(i=Sval;step && i>=Vmax;step>>=1)
        if(i-step>=Vmax)
            if(verif(i-step))
                i-=step;
    return i;
}

void afisare(int Sol)
{
    freopen("transport.out","w",stdout);
    printf("%d\n",Sol);
}

int main()
{
    citire();
    afisare(search());
    return 0;
}