Cod sursa(job #3369323)

Utilizator ifrimdragosIfrim Dragos ifrimdragos Data 19 octombrie 2026 18:26:43
Problema Transport Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

ifstream fin("transport.in");
ofstream fout("transport.out");




int main()
{

    int n , klim,kmax,i;
    fin >> n  >> klim;                                   //e superb Dumnezeu
    int v[n + 1];
    int vmax = 0;

    for(i = 1;i <= n;i++)
    {
        fin >> v[i];
                                     //computam volumul maxim ca find suma tuturor saltelelor
        vmax += v[i];

    }




    int arraykslim = log2(vmax) + 2 ;
    int ks[arraykslim];
    bool found = 0;
    int st = 1, dr = vmax , mid,kcurent = 1 ,chgvol = 0 , cnt = 0;
    while (found == 0)                           //cautam binar solutia minima dupa criteriul kcurent < = klim
    {   chgvol = 0;
        mid = (st + dr)/2;
        cnt++;                                           //pasul cb
        for ( int i = 1;i <= n;i++)                    //mid = volum curent
        {
            if((chgvol + v[i]) <= mid)
            {
                chgvol += v[i];

            }
            if ((chgvol + v[i]) > mid)
            {
                chgvol = 0;
                kcurent++;

            }



        }
        ks[cnt] = kcurent;
        kcurent = 1;
                                                 //aici avem kcurent salvat

        if(ks[cnt] <= klim)
        {
            dr = mid;
        }
        if(ks[cnt] > klim)
        {
            st = mid;
        }
        if ( st == dr - 1)
        {
            found = 1;

        }




    }
    int kst = 1 , kdr = 1;
    chgvol = 0;
    for ( int i = 1;i <= n;i++)
        {
            if((chgvol + v[i]) <= st)
            {
                chgvol += v[i];

            }
            if ((chgvol + v[i]) > st)
            {
                chgvol = 0;
                kst++;

            }
        }
        for ( int i = 1;i <= n;i++)                    //mid = volum curent
        {
            if((chgvol + v[i]) <= dr)
            {
                chgvol += v[i];

            }
            if ((chgvol + v[i]) > dr)
            {
                chgvol = 0;
                kdr++;

            }
        }
           if(kst <= klim)
           {
               fout << kst ;
           }
           else if (kdr <= klim)
           {
               fout << kdr;

            }                              // o dam la sto


    return 0;
}