Cod sursa(job #1789920)

Utilizator crazylamaRiclea Andrei crazylama Data 27 octombrie 2016 17:15:29
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <fstream>
#include <vector>
#define max(a, b) ((a) < (b) ? (b) : (a))
using namespace std;

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

vector<int> v;
int n, k;

int CautareBinara(int st, int dr, int x)
{
    if (st <= dr)
    {
        int mij = st + (dr - st) / 2;
        if (v[mij] > x)
            return CautareBinara(st, mij - 1, x);
        else if (v[mij] < x)
            return CautareBinara(mij + 1, dr, x);
        else if (v[mij] == x)
            return mij;
    }
    if (dr == -1)
        return 0;
    if (st == n)
        return n - 1;
    return st;
}

int main()
{
    f >> n >> k;
    v.resize(n);
    for (int i = 0; i < n; ++i)
    {
        int x;
        f >> x;
        if (i >= 1)
            v[i] = v[i - 1] + x;
        else
            v[i] = x;
    }
    if (k == 1)
        g << v[n - 1];
    else if (v[n - 1] % k == 0)
        g << v[n - 1] / k;
    else
    {
        int capmin = v[n - 1] / k;
        int nrZero = 0, maxim = 0;
        while (v[n - 1] != 0)
        {
            int poz = CautareBinara(nrZero, n - 1, capmin);
            int val = v[poz];
            nrZero = poz - nrZero;
            for (int i = poz; i < n; ++i)
                v[i] -= val;
            maxim = max(val, maxim);
        }
        g << maxim;
    }
    return 0;
}