Pagini recente » Istoria paginii utilizator/deehoroejkoli | Cod sursa (job #696871) | Rating Tudose Bogdan (tuse) | Cod sursa (job #1024439) | Cod sursa (job #1791719)
#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;
}