Cod sursa(job #897168)

Utilizator valiro21Valentin Rosca valiro21 Data 27 februarie 2013 19:13:16
Problema Transport Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <cstdio>
#define NMax 16001

using namespace std;

long maxx,minn,pw,j,k,n,v[NMax],x,in,maxxe,prev;

int bsearch(long in,long fn,long v[],long val) {
    long mid;
    if(v[fn]<val)
        return fn;
    while(in<=fn) {
        mid=(fn-in)/2+in;
        if(v[mid]<=val&&val<v[mid+1])
            return mid;
        else
            if(val<v[mid])
                fn=mid-1;
            else
                in=mid+1;
    }
    return 1;
}

int main()
{
    freopen("transport.in","rt",stdin);
    freopen("transport.out","wt",stdout);
    scanf("%ld %ld",&n,&k);
    for(long i=1;i<=n;i++) {
        scanf("%ld",&x);
        v[i]=v[i-1]+x;
        if(x>maxxe)
            maxxe=x;
    }

    j=k;in=0;
    while(j>1) {
        pw=v[in]+(v[n]-v[in])/j;
        minn=bsearch(in+1,n,v,pw);
        prev=in;
        in =  pw-v[minn]>v[minn+1]-pw ? minn+1 : minn;
        if(v[in]-v[prev]>maxx)
            maxx=v[in]-v[prev];
        j--;
    }

    printf("%ld",maxx);

    return 0;
}