Pagini recente » Cod sursa (job #2890211) | Cod sursa (job #1474542) | Cod sursa (job #483907) | Cod sursa (job #2174972) | Cod sursa (job #275617)
Cod sursa(job #275617)
#include<stdio.h>
#define infile "transport.in"
#define outfile "transport.out"
#define nmax 16*1001
int v[nmax]; //voulum fiecarei salte;e
int n,k; //numarul de saltele, si numarul maxim de transporturi
int vtot; //volumul tuturor saltelelor
void citire()
{
int i;
scanf("%d %d\n",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%d",&v[i]); //citim
vtot+=v[i]; //adaugam la volumul tuturor saltelelor
}
}
//verifica daca se pot transporta toate saltelele cu volumul v intr-un transport
int verifica(int vmax)
{
int i,j=0,x=1;
for(i=1;i<=n;i++) //trecem pe la feicare saltea
{
if(v[i]>vmax) return 0; //o singura saltea e mai mare decat intreaga capacitate....deci nu putem
if(j+v[i]<=vmax) //daca mai are loc si el
j+=v[i]; //il luam
else { j=v[i]; x++; } //facem un alt transport
}
if(x<=k) return 1; //se poate efectua
return 0; //nu se poate efectua
}
//cauta binar in intervalul [p,q]
int cbin(int p, int q)
{
int cmin=q; //costul, respectiv costul minim (initial maxim)
int m;
while(p<=q)
{
m=(p+q)/2; //nijlocul
if(verifica(m)) //daca se poate
{
cmin=m; //salvam cu ce se poate
q=m-1; //cautam doar in partea stanga
}
else p=m+1; //nu se poate...deci trebuie mai mare
}
return cmin; //returnam costul minim
}
int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
citire();
printf("%d",cbin(1,vtot)); //afisem costul minim (il cautam binar)
fclose(stdin);
fclose(stdout);
return 0;
}