Cod sursa(job #896992)

Utilizator valiro21Valentin Rosca valiro21 Data 27 februarie 2013 18:22:50
Problema Transport Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 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;
    }

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

    if(v[n]-v[prev]>maxx)
        maxx=v[n]-v[minn];

    printf("%ld",maxx);

    return 0;
}