Pagini recente » Cod sursa (job #538411) | Cod sursa (job #200160) | Cod sursa (job #398207) | Cod sursa (job #2757799) | Cod sursa (job #40128)
Cod sursa(job #40128)
//O(N*lgN)
#define nmax 16005
#include <stdio.h>
void bs(int);
int N, K, i, suma, cmax, retinut, nrt, c, maxim, v;
int V[nmax];
int main(void)
{
freopen("transport.in", "r", stdin);
freopen("transport.out","w",stdout);
scanf("%d%d", &N, &K);
for (i = 1; i <= N; ++i)
{
scanf("%d", &V[i]);
suma += V[i];
maxim = V[i] > maxim? V[i]: maxim;
}
cmax = v = suma;
// caut binar valoarea optima c
// daca am gasit un c bun, il memorez
bs(suma);
printf("%d\n", retinut);
return 0;
}
void bs(int suma)
{
if (suma < maxim)
nrt = K + 1;
else
{
for (i = 1, nrt = c = 0; i <= N && nrt <= K;) // instabil!
{
c += V[i];
if (c > suma)
{
nrt++;
c = 0;
}
else
++i;
}
++nrt;
}
v >>= 1;
if (nrt <= K)
{
retinut = suma;
if (v && suma - v > 0)
bs(suma - v);
}
else
if (v && suma + v <= cmax)
bs(suma + v);
}