Cod sursa(job #480656)

Utilizator budulaiSuman Dinu budulai Data 29 august 2010 01:23:25
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
	int a[16000], i,j,n,k, sum=0, m, r=0, max=0,min_growth;
	bool solved=false;
	freopen("transport.in", "r", stdin);
	//freopen("transport.out", "w", stdout);
	scanf("%d %d", &n, &k);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		sum += a[i];
		if(a[i]>max) max = a[i];
	}
	m = ceil((float)sum/k); 
	if(m<max) m = max;
	//printf("%d %d\n",n,k);
	//printf("%d\n", m);
	//printf("sum: %d\n",sum);
	//int x = ceil((float)9/3);
	//printf("%d",x);
	
	while(!solved)
	{
		r = sum;
		//printf("r: %d\n",r);
		//printf("r: %f\n",(float)r);
		//printf("r: %d\n",r);
		i=0;
		j=0;
		min_growth=16001;
		while(m>=(ceil((float)r/(k-j))))
		{
			//printf("r: %d\n",r);
		 max = a[i];
		 i++;
		 while(i<n && max<m) {max += a[i]; i++;}
		 if(max>m) 
		 {
			 if(max-m < min_growth) min_growth = max-m;
			 max -= a[--i];
		 }
		 if(i>=n) break;
		 r-=max;
		 j++; //nr de transporturi
		}
		//printf("r: %d, k: %d, j: %d \n",r,k,j);
		if(min_growth == 16001) min_growth = 1;
		if(i>=n) solved = true;
		else m+=1;
	}

	printf("%d",m);
	
	return 0;
}