Cod sursa(job #3265314)

Utilizator maxtraAlex Deonise maxtra Data 29 decembrie 2024 09:57:16
Problema Transport Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#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.
*/