Cod sursa(job #3288735)

Utilizator LeBlonkAnca Anghel LeBlonk Data 23 martie 2025 23:56:42
Problema Transport Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <cmath>
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>

using namespace std;

int maxStack (stack<int> saltele)
{
    int max = saltele.top();
    int saltea = 0;

    while (!saltele.empty())
    {
        saltea = saltele.top();

        if (saltea > max)
        {
            max = saltea;
        }

        saltele.pop();
    }

    return max;
}

int stackTraverse (stack<int> saltele, int drumuri, int max_cargo)
{
    int drum_curent = max_cargo;
    int saltea;
    int sol = 0;

    while (!saltele.empty() && drumuri > 0)
    {
        saltea = saltele.top();

        if (drum_curent - saltea >= 0)
        {
            drum_curent -= saltea;
        }
        else 
        {
            drum_curent = max_cargo - saltea;
            sol++;
            drumuri--;
        }

        saltele.pop();
    }

    if (saltele.empty())
    {
        return sol;
    }

    return 0;
}

int binarySearch (stack<int> saltele, int drumuri)
{
    int cargo_low = maxStack(saltele);
    int cargo_high = cargo_low * 2;
    int cargo_mid;

    int sol_low = 0, sol_mid = 0, sol_high = 0;

    while (true)
    {
        sol_low = stackTraverse(saltele, drumuri, cargo_low);
        sol_high = stackTraverse(saltele, drumuri, cargo_high);

        if (cargo_low + 1 == cargo_high)
        {
            if (sol_high != 0)
            {
                return sol_low;
            }
            else
            {
                return sol_high;
            }
        }

        cargo_mid = cargo_low + (cargo_high - cargo_low) / 2;
        sol_mid = stackTraverse(saltele, drumuri, cargo_mid);

        if (sol_mid == 0)
        {
            cargo_low = cargo_mid;
        }
        else
        {
            cargo_high = cargo_mid;
        }
    }
}

int main() {

    fstream fin("transport.in");
    fstream fout("transport.out");

    stack<int> saltele;
    int n, drumuri, saltea;

    fin >> n >> drumuri;

    for (int i = 0; i <= n; i++)
    {
        fin >> saltea;
        saltele.push(saltea);
    }

    fout << binarySearch(saltele, drumuri);

    return 0;
}