Pagini recente » Cod sursa (job #64391) | Cod sursa (job #2145096) | Cod sursa (job #250252) | Cod sursa (job #3166111) | Cod sursa (job #3256205)
#include <fstream>
#include <climits>
using namespace std;
ifstream fin("transport.in");
ofstream fout("transport.out");
int k, v[16001],n,salteacuvolummaxim;//salteacuvolummaximpozitie;
long long sumatotala;
int nrTransporturi(long long x)
{
// x = capacitatea
int nrt=1;
long long suma =v[1];
int i = 2;
while(i<=n)
{
if(suma+v[i]<=x)
{
suma=suma+v[i];
}
else
{
nrt++;
suma=v[i];
}
i++;
}
return nrt;
}
int main()
{
fin>>n>>k;
fin>>v[1];
salteacuvolummaxim=v[1];
sumatotala=v[1];
//salteacuvolummaximpozitie=1;
for(int i=2; i<=n; i++)
{
fin>>v[i];
if(v[i]>salteacuvolummaxim)
{
salteacuvolummaxim=v[i];
}
sumatotala=v[i]+sumatotala;
}
long long st = salteacuvolummaxim;
long long dr = sumatotala;
long long capMinima = LLONG_MAX;
while(st<=dr)
{
long long mijloc=(st+dr)/2; // capacitatea pe care o incerc
int nrt= nrTransporturi(mijloc);
if(nrt<=k)
{
// o posibila solutie
if(mijloc < capMinima)
{
capMinima = mijloc;
}
dr = mijloc-1;
}
else
{
// aleg o capacitate mai mare
st = mijloc+1;
}
}
fout<<capMinima;
return 0;
}