Pagini recente » Cod sursa (job #1200549) | Autentificare | Cod sursa (job #823914) | Cod sursa (job #2004784) | Cod sursa (job #2004048)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("transport.in");
ofstream out("transport.out");
int st[16001], n, nrDrum;//date de intrare
int capMin, capMax;//capacitatea minima este val maxima din stiva
//capacitatea maxima este suma
void citire(){
in >> n >> nrDrum;
for(int i = 1; i <= n; i++){
in >> st[i];
if(st[i] > capMin){
capMin = st[i];
}
capMax += st[i];
}
}
int nrTransporturi(int capacitate){
int nrTrans = 0, unTrans ;
int vf = n;
unTrans = st[vf];
vf--;
while(vf != 0){
if(unTrans + st[vf] > capacitate){
nrTrans++;
unTrans = st[vf];//incep transport nou
}
else{
unTrans += st[vf];
}
vf --;
}
nrTrans++;
return nrTrans;
}
int sol = 0;
void cautareBinara(int st, int dr){
if(st <= dr && st >= capMin && dr <= capMax){
int mij = (st + dr) / 2;
int var = nrTransporturi(mij);
if(var < nrDrum){//capacitate prea mare, ma duc in st
dr = mij - 1;
}
else if(var > nrDrum){//capacitate prea mica, ma duc in dr
st = mij + 1;
}
else if(var == nrDrum){//capacitate egala, verific pt nr-le din st, daca mai sunt
sol = mij;
dr = mij - 1;
}
cautareBinara(st, dr);
}
}
void afisare(){
if(nrTransporturi(1) == nrDrum){
sol = 1;
}
else {
cautareBinara(capMin, capMax);
}
out << sol;
}
int main(){
citire();
afisare();
return 0;
}