Cod sursa(job #3296754)

Utilizator Stefan_ClaudiuStefan Claudiu Stefan_Claudiu Data 16 mai 2025 14:55:51
Problema Transport Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <iostream>
#include <fstream>

using namespace std;

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

bool este_solutie(int x, int n, int k, int volume[])
{
    int vol_transport=0, kaux=1;
    for(int i=0; i<n; i++)
    {
        if(vol_transport+volume[i]<=x)
        {
            vol_transport=vol_transport+volume[i];
        }
        else
        {
            kaux++;
            if(kaux>k)
            {
                return false;
            }
            vol_transport=0;
            vol_transport=vol_transport+volume[i];
        }
    }
    return true;
}

int cautare_binara(int solutii[], int nrsol, int volume[], int n, int k)
{
    int st, dr, m, sol=-1;
    st=0;
    dr=nrsol-1;
    while(st<=dr)
    {
        m=(st+dr)/2;
        if(este_solutie(solutii[m], n, k, volume))
        {
            sol=solutii[m];
            //fout<<st<<" "<<dr<<" "<<m<<" "<<solutii[m]<<" "<<sol<<endl;
            dr=m-1;
        }
        else
        {
            st=m+1;
        }
    }
    return sol;
}

int main()
{
    int n, k, v, vol_max=-1, vol_sum=0, aux, nrsol, c;
    fin>>n>>k;
    int volume[n];
    for(int i=0; i<n; i++)
    {
        fin>>volume[i];
        if(volume[i]>vol_max)
        {
            vol_max=volume[i];
        }
        vol_sum=vol_sum+volume[i];
    }
    nrsol=vol_sum-vol_max+1;
    int solutii[nrsol];

    aux=vol_max;
    for(int i=0; i<nrsol; i++)
    {
        solutii[i]=aux;
        aux++;
    }

    /*
    cout<<vol_max<<" "<<vol_sum<<" "<<nrsol<<endl;
    for(int i=0; i<nrsol; i++)
    {
        cout<<solutii[i]<<" ";
    }
    */

    c=cautare_binara(solutii, nrsol, volume, n, k);
    fout<<c;

    fin.close();
    fout.close();
    return 0;
}