Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Istoria paginii utilizator/alexia208160 | Profil razveh | Cod sursa (job #1791514)
#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;
}