Pagini recente » Cod sursa (job #2613505) | Cod sursa (job #1480432) | Cod sursa (job #3161170) | Cod sursa (job #1821861) | Cod sursa (job #2209379)
#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;
}