Cod sursa(job #2209379)

Utilizator VladAfrasineiAfrasinei VladAfrasinei Data 3 iunie 2018 10:59:54
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.92 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("transport.in");
ofstream fout("transport.out");
int n,k,a[16005],s,maxi,mini;
int main()
{
    int i,st,dr,m,ct,S;
fin>>n>>k;
for(i=1;i<=n;i++)
{
    fin>>a[i];
    s+=a[i];
    if(a[i]>maxi) //Ideea este ca numarul minim pentru volum se afla intre cel mai mare element(deoarece fiecare element trebuie adaugat la transport) si suma tuturor in cazul in care k este 1
        maxi=a[i];
}
mini=s;
st=maxi;
dr=s;
while(st<=dr) //Se aplica cautare binara pe suma si maxim unde doar se verifica daca se poate face cu maxim k transporturi de volum m
{
    m=(st+dr)/2;
    ct=1;
    S=a[1];
    for(i=2;i<=n&&ct<=k;i++)
        if(S+a[i]>m)
        {
            S=a[i];
            ct++;
        }
        else
            S+=a[i];
    if(ct>k)
        st=m+1;
    else
    {dr=m-1;
    mini=m;
    }
}
fout<<mini;
    return 0;
}