Cod sursa(job #1247071)

Utilizator tweetyMarinescu Ion tweety Data 22 octombrie 2014 00:54:47
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>
using namespace std;

int N;
int K;
int maxim;
int sum;
int v[16000];

void readData()
{
    FILE* in = freopen("transport.in", "r", stdin);

    scanf("%d", &N);
    scanf("%d", &K);

    for (int i = 0; i != N; ++i)
    {
        scanf("%d", &v[i]);

        if (v[i] > maxim)
            maxim = v[i];

        sum += v[i];
    }

    fclose(in);
}

bool Transport(int capacitate)
{
    int suma = 0;
    int trans = K;

    for (int i = 0; i != N; ++i)
        if ((suma + v[i]) > capacitate)
        {
            if (--trans < 0)
                return false;

            suma = 0;
            --i;
        }
        else
            suma += v[i];

    if (suma)
        return --trans >= 0;

    return true;
}

int cautare_binara(int ls, int ld, int x = 0)
{
    if (ls == ld)
        return ls;

    if (ls + 1 == ld)
    {
        if (Transport(ls))
            return ls;

        if (Transport(ld))
            return ld;

        return x;
    }

    int m = (ls + ld) / 2;

    if (Transport(m))
        return cautare_binara(ls, m, m);
    else
    {
        if (x != 0)
            return cautare_binara(m, x, x);
        else
            return cautare_binara(m, ld);
    }
}

void printData()
{
    FILE* out = freopen("transport.out", "w", stdout);
    printf("%d", cautare_binara(maxim, sum));
    fclose(out);
}

int main()
{
    readData();
    printData();

    return 0;
}