Cod sursa(job #1322450)

Utilizator andrei.arnautuAndi Arnautu andrei.arnautu Data 20 ianuarie 2015 01:40:39
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 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, s = 0;

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

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

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

        else
            left = m + 1;
    }

    printf("%d", rez);
}

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