Pagini recente » Cod sursa (job #1524621) | Cod sursa (job #914936) | Cod sursa (job #3039786) | Cod sursa (job #1596730) | Cod sursa (job #40180)
Cod sursa(job #40180)
//O(N*lgN)
#define nmax 16005
#include <stdio.h>
void bs(int);
int N, K, i, suma, cmax, retinut, nrt, c, maxim, v, ultim, tata;
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 >> 1);
ultim = tata = suma;
// caut binar valoarea optima c
// daca am gasit un c bun, il memorez
bs(cmax);
printf("%d\n", retinut);
return 0;
}
void bs(int suma)
{
int m;
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)
{
ultim = retinut = suma;
m = (suma + 1) >> 1;
if (m > 0 && m != suma)
bs(m);
}
else
{
// aici
m = (suma + ultim) >> 1;
if (m != suma)
bs(m);
}
}