Cod sursa(job #1791514)

Utilizator crazylamaRiclea Andrei crazylama Data 29 octombrie 2016 14:16:50
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 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 = capmin - v[st], b = capmin - 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
    {
        capmin = v[n - 1] / k;
        int nrZero = 0, maxim = capmin;
        while (v[n - 1] != 0)
        {
            int poz = CautareBinara(nrZero, n - 1, maxim);
            int val = v[poz];

            for (int i = 0; i < n; ++i)
                g << v[i] <<" ";
            g << endl;

            nrZero = poz - nrZero;
            for (int i = poz; i < n; ++i)
                v[i] -= val;
            maxim = max(val, maxim);
        }
        g << maxim;
    }
    return 0;
}