Cod sursa(job #275617)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 10 martie 2009 16:16:42
Problema Transport Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.48 kb
#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;
}