Pagini recente » Cod sursa (job #3162447) | Cod sursa (job #2471634) | Cod sursa (job #2931461) | Cod sursa (job #699774) | Cod sursa (job #2109923)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long int n, k, volum[16050];
long long int lg = 1, log = 1, suma[16050], maxim = 0;
bool transpo(long long int x)
{
long long int s, i, lg1;
long long int poz = 0;
bool ok = 0;
for(int aux = 0; aux<k; aux++)
{
s = x;
i = 0;
lg1 = lg;
for(; lg1!=0; lg1>>=1)
if(suma[i+lg1]<=suma[n] && suma[i+lg1]-suma[poz]<=s)
i+=lg1;
if(i!=n)
{
poz = i;
}
if(i == n)
{
ok = 1;
break;
}
}
return ok;
}
void loga()
{
long long int lg1 = log;
//long long int i = suma[n]/k;
/*for(; i<suma[n]; i++)
if(transpo(i) == 1)
{
printf("%lld", i);
return;
}*/
long long int i = lg1;
for(;lg1>0; lg1>>=1)
{
if(i-lg1>=maxim && transpo(i-lg1))
{
i-=lg1;
}
}
printf("%d", i);
}
void rez()
{
suma[0] = 0;
for(int i = 1; i<=n; i++)
{
scanf("%lld\n", &volum[i]);
suma[i] = suma[i-1]+volum[i];
if(volum[i]>maxim)
maxim = volum[i];
}
while(lg<n)
lg=(lg<<1);
log<<=14;
for(int i = n+1; i<=lg; i++)
suma[i] = 256000050;
loga();
}
int main()
{
freopen("transport.in", "r", stdin);
freopen("transport.out", "w", stdout);
scanf("%lld %lld\n", &n, &k);
rez();
return 0;
}