Mai intai trebuie sa te autentifici.
Cod sursa(job #3262103)
| Utilizator | Data | 8 decembrie 2024 19:00:22 | |
|---|---|---|---|
| Problema | Transport | Scor | 0 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva de probleme | Marime | 1.36 kb |
#include <bits/stdc++.h>
using namespace std;
int v[100005];
bool checker(int capacitatea, int n, int k) {
int greutateCurenta = 0;
int numarTransporturi = 0;
for (int i = 1; i <= n; ++i) {
if (greutateCurenta + v[i] <= capacitatea) {
// daca pot sa adaug la transportul curent pe i, atunci il adaug si merg mai departe
greutateCurenta += v[i];
} else {
// daca nu pot, atunci imi formez tranportul curent si il numar
numarTransporturi += 1;
// resetez greutatea curenta
greutateCurenta = 0;
// scad i ul cu 1 ca impreuna cu ++i de la for, sa ajung iar inapoi la elementul curent
i -= 1;
}
if (numarTransporturi > k) {
return false;
}
}
numarTransporturi += 1;
if (numarTransporturi > k) {
return false;
} else {
return true;
}
}
int main()
{
freopen("transport.in", "r", 0);
freopen("transport.out", "w", stdout);
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; ++i) {
cin >> v[i];
}
int left = 1, right = 1000000000;
while (left < right) {
int middle = (left + right) / 2;
if (checker(middle, n, k)) {
right = middle;
} else {
left = middle + 1;
}
}
cout << left;
return 0;
}