Pagini recente » Cod sursa (job #96763) | Cod sursa (job #1018482) | Cod sursa (job #446974) | Cod sursa (job #2862784) | Cod sursa (job #1024067)
#include <iostream>
#include <fstream>
using namespace std;
int v[16001], n, k, i, maxim, total;
int verif(int capacit) // verificam daca capacitatea camionului este buna
{
int drumuri=1, salt_puse=0;
for(i=1; i<=n; i++)
if(salt_puse + v[i] <= capacit) // daca am mai pune o saltea nu se depaseste capcaitatea camionului
salt_puse += v[i]; // punem salteaua
else // daca depaseste capacitatea
{
drumuri++; // inseamna ca trecem la drumul urmator
salt_puse=0; // resetam numarul saltelelor puse in acest nou camion
i--; // scadem contorul pentru a reevalua salteaua care a depasit capacitatea
}
if(drumuri <= k) // daca numarul de drumuri este destul de mic
return 1; // inseamna ca am gasit solutia
return 0; // daca nu, nu este buna solutia
}
int caut_bin(int st, int dr)
{
if(st > dr) // daca s-a ajuns cu limita stanga mai mare decat cea dreapta
return st; // inseamna ca am gasit capacitatea dorita
int mij = (st+dr)/2;
if(verif(mij)) // daca capacitatea presupusa este satisfacatoare
return caut_bin(st, mij-1); // incerca sa gasim o capacitate mai mica, in stanga
else // daca capacitatea presupusa este prea mica
return caut_bin(mij+1, dr); // cautam una mai mare, in dreapta
}
int main()
{
ifstream f ("transport.in");
ofstream g ("transport.out");
f >> n >> k;
while (f >> v[++i]) // citim volumele saltelelor din fisier
{
maxim = v[i] > maxim? v[i] : maxim; // cautam maximul
total += v[i]; // facem suma
}
g << caut_bin(maxim,total); // capacitatea dorita se afla intre cea mai mare saltea si suma tuturor saltelelor
return 0;
}