Cod sursa(job #1322432)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 20 ianuarie 2015 00:56:38
Problema Transport Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <cstdio>
#define MaxN 1 << 14
using namespace std;

FILE *fin=freopen("transport.in","r",stdin);
FILE *fout=freopen("transport.out","w",stdout);

int n, MaxG = MaxN * MaxN, k;
int v[MaxN];


void Read()
{
    scanf("%d%d", &n, &k);
    for(int i = 1; i <= n ; ++i)
        scanf("%d", &v[i]);
}

inline int Check(int x)
{
    int cnt = 0;

    for(int i = 1, s = 0; i <= n; ++i)
    {
        if( v[i] > x )
            return 0;
        if( s + v[i] == x )
        {
            ++cnt;
            s = 0;
        }
        else if( s + v[i] > x )
        {
            ++cnt;
            s = v[i];
        }

        else
            s += v[i];
    }
    if( cnt + 1 <= k )
        return 1;
    return 0;
}

void Solve()
{
    int left = 0, right = MaxN, m;

    while( left + 1 < right )
    {
        m = (left + right) >> 1;
        if( Check(m) )
            right = m;
        else
            left = m;
    }

    printf("%d", right);
}

int main()
{
    Read();
    Solve();
}