Pagini recente » Cod sursa (job #201070) | Cod sursa (job #108749) | Cod sursa (job #1539145) | Cod sursa (job #202450) | Cod sursa (job #2017159)
//Problem 115
#include <iostream>
#include <fstream>
#include <limits.h>
#include <vector>
std::vector<short int> saltele; //Stiva cu volumul saltelelor
unsigned long int solutie = ULONG_MAX;
unsigned long int testare(unsigned long int min_capacitate, short int max_transporturi)
{
int suma = 0;
short int i = 0;
int num_de_transp = 0;
while(i < saltele.size() && num_de_transp <= max_transporturi)
{
if(suma + saltele[i] > min_capacitate)
{
num_de_transp++;
suma = 0;
}
else{
suma += saltele[i];
i++;
}
}
if(suma > 0)
{
num_de_transp++;
}
return num_de_transp;
}
void cautareaBinara(unsigned long int stanga, unsigned long int dreapta, short int max_transporturi)
{
if(stanga != dreapta)
{
unsigned long int mijloc = (dreapta + stanga) / 2 + 1;
//std::cout << "mijloc: " << mijloc << " dreapta: " << dreapta << " stanga: " << stanga;
if(testare(mijloc, max_transporturi) > max_transporturi)
{
cautareaBinara(mijloc + 1, dreapta, max_transporturi);
}
else if(testare(mijloc, max_transporturi) <= max_transporturi)
{
if(mijloc < solutie)
{
solutie = mijloc;
}
cautareaBinara(stanga, mijloc - 1, max_transporturi);
}
}
}
int main()
{
std::ifstream in_transport("transport.in");
std::ofstream out_transport("transport.out");
short int K, N;
in_transport >> N >> K;
short int volum; // Volum saltea
while(in_transport >> volum)
{
saltele.push_back(volum);
}
cautareaBinara(1, 20000, K);
out_transport << solutie;
return 0;
}