Pagini recente » Cod sursa (job #755736) | Cod sursa (job #2207943) | Cod sursa (job #131814) | Cod sursa (job #1717414) | Cod sursa (job #1597941)
#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))
volum_camion=left;
}
else
{
unsigned long int middle=(left+right)/2;
if (check_volum_camion(middle))
volum_camion=middle;
cautare_binara(left, middle);
if (!volum_camion)
cautare_binara(middle+1, right);
}
}
void show()
{
out<<volum_camion;
}
int main()
{
read();
cautare_binara(volum_maxim, volum_total_saltele);
show();
return 0;
}