Cod sursa(job #1598032)

Utilizator PraetorGrigorosoaia Florin Praetor Data 12 februarie 2016 16:09:54
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<fstream>
#define NRMS 16002 // numarul maxim de saltele

using namespace std;

FILE*in;
ofstream out("transport.out");

int nr_saltele;
int nr_drumuri;
int volum[NRMS];
int volum_maxim;
unsigned long int volum_total_saltele;
unsigned long int volum_camion;

void read()
{
    in=fopen("transport.in", "r");

    fscanf(in, "%d%d", &nr_saltele, &nr_drumuri);
    for (int i=1; i<=nr_saltele; i++)
    {
        fscanf(in, "%d", &volum[i]);

        if (volum[i] > volum_maxim)
            volum_maxim=volum[i];

        volum_total_saltele+=volum[i];
    }
}

bool check_volum_camion(unsigned long int volum_camion_test)
{
    int nr_drumuri_efectuate=1;
    int volum_adaugat=0;
    int contor=1;

    while ((contor <= nr_saltele) && (nr_drumuri_efectuate <= nr_drumuri))
    {
        if (volum[contor]+volum_adaugat <= volum_camion_test)
            volum_adaugat+=volum[contor];
        else
        {
            nr_drumuri_efectuate++;
            volum_adaugat=volum[contor];
        }
        contor++;
    }

    if (nr_drumuri_efectuate > nr_drumuri)
        return false;
    else
        return true;
}

void cautare_binara(unsigned long int left, unsigned long int right)
{
    if (left == right)
    {
        if ((check_volum_camion(left)) && (left < volum_camion))
            volum_camion=left;
    }
    else if (left < right)
    {
        unsigned long int middle=(left+right)/2;
        if ((check_volum_camion(middle)) && (middle < volum_camion))
        {
            volum_camion=middle;
            cautare_binara(left, middle);
        }
        else
            cautare_binara(middle+1, right);
    }
}

void show()
{
    out<<volum_camion;
}

int main()
{
    read();
    volum_camion=volum_total_saltele+1;
    cautare_binara(volum_maxim, volum_total_saltele);
    show();

    return 0;
}