Pagini recente » Cod sursa (job #1810882) | Cod sursa (job #763042) | Cod sursa (job #2516641) | Cod sursa (job #1757997) | Cod sursa (job #3265314)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("transport.in");
ofstream out("transport.out");
int a[16001], n, m, i, k, j, l, mid;
int poateTransporta(int x)
{
int s = 0, cnt = 1;
for (i = 1; i <= n; i++)
{
if (a[i] > x)
return 0;
s += a[i];
if (s > x)
{
cnt++;
s = a[i];
}
}
if (cnt <= k)
return 1;
return 0;
}
int capacitateMinima(int a[])
{
int st = 1, dr = 256000000, ok = -1;
while (st <= dr)
{
mid = st + (dr - st) / 2;
if (poateTransporta(mid))
{
ok = mid;
dr = mid - 1;
}
else st = mid + 1;
}
return ok;
}
int main()
{
in >> n >> k;
for (i = 1; i <= n; i++)
in >> a[i];
out << capacitateMinima(a);
return 0;
}
/*
Funcția poateTransporta:
Verifică dacă un camion de capacitate c poate transporta toate saltelele în cel mult k curse.
Parcurge vectorul v și verifică fiecare saltea:
Dacă volumul unei saltele este mai mare decât capacitatea camionului, returnează false.
Dacă spațiul rămas în camion nu permite încărcarea saltelei curente, începe o nouă cursă și actualizează numărul de curse.
Dacă numărul de curse depășește k, returnează false.
Funcția capacitateMinima:
Utilizează căutarea binară pentru a determina capacitatea minimă a camionului.
Inițializează limitele căutării:
st = 1: capacitatea minimă posibilă.
dr = 16000 * 16000: capacitatea maximă (produsul volumului maxim cu numărul maxim de saltele).
La fiecare pas, verifică mijlocul intervalului:
Dacă este posibil transportul cu această capacitate, salvează rezultatul și continuă să caute o capacitate mai mică.
Altfel, continuă căutarea într-un interval mai mare.
*/