Pagini recente » Cod sursa (job #1018865) | Cod sursa (job #1892544) | Cod sursa (job #2503879) | Cod sursa (job #342787) | Cod sursa (job #2418720)
#include <fstream>
using namespace std;
ifstream in("transport.in");
ofstream out("transport.out");
const int N = 16000*16000+10;
int n,k,greutate_totala,gr_max,a[16001],st=1,dr=N,mij,i;
bool check_capacity(int c)
{
int x=0,transporturi=0;
for (int i=1; i<=n; ++i)
{
x+=a[i];
if (x>c) transporturi++,x=a[i];
else if (x==c) transporturi++,x=0;
}
if (x) transporturi++;
if (transporturi<=k) return true;
return false;
}
int main()
{
in>>n>>k;
for (i=1; i<=n; ++i)
{
in>>a[i];
greutate_totala+=a[i];
gr_max=max(gr_max,a[i]);
}
if (k==1) out<<greutate_totala<<"\n";
else if (k>=n) out<<gr_max<<"\n";
else
{
while (st<dr)
{
mij=(st+dr)/2;
if (mij>=gr_max && check_capacity(mij)) /// if (check_capacity(mij)) nu functioneaza pentru ca greutatea testata coboara sub cea mai mare greutate a unei saltele, ceea ce inseamna teoretic ca nu o putem incarca in camion, iar functia returneaza eronat incadrandu-se totusi in numarul de transporturi
/// exemplu de testat fara mij>=gr_max : n=6 k=5 si greutati : 7 3 2 1 1 4 (la final va da 4 in loc de 7)
dr=mij;
else
st=mij+1;
}
out<<dr<<"\n";
}
}