Pagini recente » Cod sursa (job #3323085) | Cod sursa (job #3323083) | Cod sursa (job #3322465) | Cod sursa (job #1135285) | Cod sursa (job #3327102)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
// Funcția care verifică dacă o capacitate dată este suficientă
// pentru a transporta saltelele în maxim K ture.
bool esteValid(long long capacitate, int n, int k, const vector<int>& volume) {
int numarTransporturi = 1;
long long incarcaturaCurenta = 0;
for (int i = 0; i < n; i++) {
if (incarcaturaCurenta + volume[i] <= capacitate) {
// Putem adăuga salteaua în transportul curent
incarcaturaCurenta += volume[i];
}
else {
// Trebuie să facem un nou transport
numarTransporturi++;
incarcaturaCurenta = volume[i];
}
}
return numarTransporturi <= k;
}
int main() {
ifstream fin("transport.in");
ofstream fout("transport.out");
int n, k;
fin >> n >> k;
vector<int> volume(n);
long long maxVol = 0;
long long sumaTotala = 0;
for (int i = 0; i < n; i++) {
fin >> volume[i];
// Calculăm limitele pentru căutarea binară
if (volume[i] > maxVol) {
maxVol = volume[i];
}
sumaTotala += volume[i];
}
// Intervalul de căutare
long long stanga = maxVol;
long long dreapta = sumaTotala;
long long rezultat = sumaTotala;
while (stanga <= dreapta) {
long long mid = stanga + (dreapta - stanga) / 2;
if (esteValid(mid, n, k, volume)) {
// Capacitatea 'mid' este suficientă, încercăm să găsim una mai mică
rezultat = mid;
dreapta = mid - 1;
}
else {
// Capacitatea 'mid' este prea mică (ne trebuie mai multe ture decât K)
stanga = mid + 1;
}
}
fout << rezultat;
fin.close();
fout.close();
return 0;
}