Cod sursa(job #1247059)

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

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

void readData()
{
    FILE* in = freopen("transporturi.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)
{
    int m = (ls + ld) / 2;

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

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

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

    return 0;
}