Cod sursa(job #1795833)

Utilizator crazylamaRiclea Andrei crazylama Data 2 noiembrie 2016 21:27:42
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <vector>
#define max(a, b) ((a) < (b) ? (b) : (a))
#define MAX 1 << 30
using namespace std;

ifstream f("transport.in");
ofstream g("transport.out");

vector<int> v;
int n, k, maxim;

int nr_comp(int val)
{
    if (val < maxim)
        return MAX;
    int current = 0, nrComp = 1;
    for (int i = 0; i < n; ++i)
        if (current + v[i] <= val)
            current += v[i];
        else
        {
            ++nrComp;
            current = v[i];
        }
    return nrComp;
}

int CautareBinara(int st, int dr)
{
    if (st <= dr)
    {
        int mij = st + (dr - st) / 2;
        int _nrComp = nr_comp(mij);
        if (_nrComp <= k && nr_comp(mij - 1) > k)
            return mij;
        else
        {
            if (_nrComp > k)
                return CautareBinara(mij + 1, dr);
            else
                return CautareBinara(st, mij - 1);
        }
    }
    return -1;
}

int main()
{
    int s = 0;
    maxim = -1;
    f >> n >> k;
    v.resize(n);
    for (int i = 0; i < n; ++i)
    {
        f >> v[i];
        maxim = max(maxim, v[i]);
        s += v[i];
    }
    g << CautareBinara(maxim, s);
    return 0;
}