Pagini recente » Istoria paginii utilizator/upt_okros_stef_retzler | Istoria paginii utilizator/ramonaturcu | Istoria paginii runda/ala1235 | Istoria paginii template/grigore-moisil-2008 | Cod sursa (job #207029)
Cod sursa(job #207029)
/*transport*/
#include<fstream.h>
long v[16005],k,v_max,s,d,st,dr,m;
int n,id;
ifstream fin("transport.in");
ofstream fout("transport.out");
void citire()
{
int i;
fin>>n>>k;
for(i=0;i<n;i++)
{
fin>>v[i];
s+=v[i];
if(v[i]>v_max)
v_max=v[i];
}
}
int verifica(long d)
{
int i;
long sv,cont=0;
for(i=0;i<n&& cont<k;)
{
sv=d;
while(sv-v[i]>=0&&i<n)
{
sv-=v[i];
i++;}
cont++;
}
if(i<n)
return 0;
else
if(cont<k)
return 2;
else
return 1;
}
int verifica1()
{
int i;
long sv,cont=0;
for(i=0;i<n&& cont<k;)
{
sv=d;
while(sv-v[i]>=0&&i<n&&sv!=0)
{
sv-=v[i];
i++;}
cont++;
}
if(i<n)
return 0;
else
return 1;
}
int main()
{
int ok=0;
citire();
if(s%k!=0)
d=s/k+1;
else
d=s/k;
if(d<v_max)
d=v_max;
st=d;
dr=s;
while(ok==0)
{
m=(st+dr)/2;
id=verifica(m);
if(id==0)
st=m+1;
else
if(id==2)
dr=m-1;
else
ok=1;
}
d=m;
while(verifica1()==1)
d--;
fout<<d+1<<'\n';
fout.close();
return 0;
}