Pagini recente » Cod sursa (job #2400524) | Cod sursa (job #962232) | Cod sursa (job #384331) | Cod sursa (job #1031543) | Cod sursa (job #2178735)
#include <fstream>
using namespace std;
ifstream fin("transport.in");
ofstream fout("transport.out");
const int NMAX = 16005;
int vec[NMAX], n, k;
int main() {
fin >> n >> k;
int lo = 0, hi = 0;
for (int i = 1; i <= n; ++ i) {
fin >> vec[i];
if (vec[i] > lo)
lo = vec[i];
hi += vec[i];
}
fin.close();
int ans = NMAX * NMAX;
/* se cauta binar valoarea ceruta, intre dimensiunea maxima a unei saltele (vor fi maxim n
tranposturi) si suma saltelelor (va fi un transport) */
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
int cnt = 1, qty = mid;
bool ok = true;
for (int i = 1; i <= n && ok; ++ i) {
if (vec[i] > mid) {
// exista o saltea cu dimensiunea mai mare decat a camionului
ok = false;
}
else {
if (vec[i] <= qty) {
// salteaua curenta se poate pune in camionul curent
qty -= vec[i];
}
else {
// trebuie un nou camion
++ cnt;
qty = mid - vec[i];
}
}
}
if (ok && cnt <= k) {
if (mid < ans)
ans = mid;
hi = mid - 1;
}
else
lo = mid + 1;
}
fout << ans << "\n";
fout.close();
return 0;
}