Pagini recente » Cod sursa (job #3207008) | Cod sursa (job #1152259) | Cod sursa (job #2055262) | Cod sursa (job #2401206) | Cod sursa (job #1247071)
#include <stdio.h>
using namespace std;
int N;
int K;
int maxim;
int sum;
int v[16000];
void readData()
{
FILE* in = freopen("transport.in", "r", stdin);
scanf("%d", &N);
scanf("%d", &K);
for (int i = 0; i != N; ++i)
{
scanf("%d", &v[i]);
if (v[i] > maxim)
maxim = v[i];
sum += v[i];
}
fclose(in);
}
bool Transport(int capacitate)
{
int suma = 0;
int trans = K;
for (int i = 0; i != N; ++i)
if ((suma + v[i]) > capacitate)
{
if (--trans < 0)
return false;
suma = 0;
--i;
}
else
suma += v[i];
if (suma)
return --trans >= 0;
return true;
}
int cautare_binara(int ls, int ld, int x = 0)
{
if (ls == ld)
return ls;
if (ls + 1 == ld)
{
if (Transport(ls))
return ls;
if (Transport(ld))
return ld;
return x;
}
int m = (ls + ld) / 2;
if (Transport(m))
return cautare_binara(ls, m, m);
else
{
if (x != 0)
return cautare_binara(m, x, x);
else
return cautare_binara(m, ld);
}
}
void printData()
{
FILE* out = freopen("transport.out", "w", stdout);
printf("%d", cautare_binara(maxim, sum));
fclose(out);
}
int main()
{
readData();
printData();
return 0;
}