Cod sursa(job #480660)

Utilizator budulaiSuman Dinu budulai Data 29 august 2010 01:43:08
Problema Transport Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 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;
	//float x;
	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];
	}
	//x = 
	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);
	//float f = (float)10/9;
	//printf("%f\n",f);
	//int w = ceil(f);
	//printf("%d",w);
	
	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;
		//x = (float)r/(k-j);
		//y = ;x
		while(m>=((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];
		 }
	//	 else
		//	if(i<n && a[i] < min_growth) min_growth = 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+=min_growth;
	}

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