Cod sursa(job #1791719)

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

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

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

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;
    int a = x - v[st], b = x - v[dr];
    if (abs(a) <= abs(b))
        return st;
    return dr;
}

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 (n <= k)
    {
        int maxim = 0;
        for (int i = n - 1; i >= 1; --i)
            v[i] = v[i] - v[i - 1];
        for (int i = 0; i < n; ++i)
            maxim = max(maxim, v[i]);
        g << maxim;
    }
    else
    {
        capmin = v[n - 1] / k;
        int nrZero = 0, maxim = 0, nr = 0;
        while (nr < k - 1)
        {
            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);
            capmin = max(capmin, maxim);
            nr++;
        }
        maxim = max(v[n - 1], maxim);
        g << maxim;
    }
    return 0;
}