Cod sursa(job #3364713)

Utilizator AyanPAyan Porumb AyanP Data 9 septembrie 2026 16:42:48
Problema Transport Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <fstream>

using namespace std;

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

bool transport(int l, int sump[], int nrt,int cap)
{
    int nrdrumuri=0,i=0;
    for (; i<l && sump[i]<=cap; i++)
    {}
    i--;
    nrdrumuri++;
    int j=i+1;
    for(; j<l;j++)
    {
        if(sump[j]-sump[i]>cap)
        {
            nrdrumuri++;
            i=j-1;
        }
    }
    j--;
    //cout<<"i: "<<i<<"  j: "<<j<<"\n";
    if(sump[j]>sump[i]){
    nrdrumuri++;
    //cout<<"x";
    }
    //cout<<"nrdrumuri pentru capacitate egala cu "<<cap<<": "<<nrdrumuri<<" \n";
    if(nrdrumuri<=nrt)
        return true;
    else
        return false;

}

int main()
{
    int n,k;
    fin>>n>>k;
    int v[n],sp[n];
    fin>>v[0];
    for (int i=0; i<n;i++)
        sp[i]=0;
    sp[0]=v[0];
    for (int i=1; i<n; i++)
    {
        fin>>v[i];
        sp[i]=sp[i-1]+v[i];
    }
    int x=100;
    //cout<<transport(n, sp, k, x);
    int st=0,dr=256000000,mij,c1,c2;
    mij=(st+dr)/2;
    c1=transport(n, sp, k, mij-1);
    c2=transport(n, sp, k, mij);
    while(c1!=1 || c2!=0)
    {
        if (c1==1 && c2==1)
        {
            dr=mij;
        }
        else if(c1==0 && c2==0)
        {
            st=mij;
        }
        mij=(dr+st)/2;
        c1=transport(n, sp, k, mij-1);
        c2=transport(n, sp, k, mij);
    }
    fout<<mij+1;
//    */;
    return 0;
}