Cod sursa(job #2017159)

Utilizator skoda888Alexandru Robert skoda888 Data 31 august 2017 13:37:00
Problema Transport Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb

//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;
}