Pagini recente » Monitorul de evaluare | Cod sursa (job #1436502) | Cod sursa (job #2276950) | Cod sursa (job #1680685) | Cod sursa (job #2811741)
#include <fstream>
#include <iostream>
using namespace std;
int N, K; // N saltele, K transporturi
int saltele[16000];
bool incercare(int cap) { // capacitatea minima a camionului
// returneaza true, daca pentru o anumita capacitate data
// se poate realiza problema
int transporturi = 0, index = 0, volum;
while (index < N) { // indexul din stiva
volum = 0;
//if(saltele[index] > cap) return false; // daca exista o saltea care depaseste capacitatea camionului - nu mai e nevoie sa verific
while (volum + saltele[index] <= cap) {
volum += saltele[index++];
}
transporturi++;
if (transporturi > K) return false; // daca am depasit nr de transporturi permis
}
return true; // daca totul a mers bine, intorc true
}
int verific(int p, int q) {
// cout << p << " " << q << endl; // debug purpose
if (p == q) return p;
int cap = (p + q) / 2;
if (incercare(cap))
return verific(p, cap); // incercam cu una mai mica
else
return verific(cap+1, q); // trebuie una mai mare
}
int main() {
ifstream fin("transport.in");
ofstream fout("transport.out");
fin >> N >> K;
int cap_min = 0, cap_max = 0;
int x;
// cap_min va fi volumul celei mai mari saltele
// cap_max va fi suma volumelor tuturor saltelelor
for (int i = 0; i < N; i++) {
fin >> x;
if (x > cap_min) cap_min = x;
cap_max += x;
saltele[i] = x;
}
// cout << verific(cap_min, cap_max); // debug purpose
fout << verific(cap_min, cap_max);
fin.close();
fout.close();
return 0;
}