Cod sursa(job #96844)

Utilizator savimSerban Andrei Stan savim Data 3 noiembrie 2007 22:00:16
Problema Transport Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
int main()
{
	long nr,t,r,p,q,i,k,n;
	long a[16000];

	freopen("transport.in","r",stdin);
	freopen("transport.out","w",stdout);

	scanf("%ld%ld",&n,&k);
	p=0;q=0;
	for (i=1; i<=n; i++)
	{
			scanf("%ld",&a[i]);
			q=q+a[i];
			if (a[i]>p) p=a[i];
	}
	if (k==1)
	{
		t=0;
		for (i=1; i<=n; i++)
			t=t+a[i];
		printf("%ld",t);
		return 0;
	}

	while (p<q)
	{
		   r=(p+q)/2;
		   t=0;nr=0;
		   i=0;
		   while (i<n)
		   {
				 i++;
				 if (t+a[i]<r)
					t=t+a[i];
				 else
				 {
					 nr++;
					 t=0;
					 i--;
				 }
		   }
		  nr++;
		  if (nr==k) break;
		  else if (nr>k) p=r;
			   else q=r;
	}
	q=1;
	while (q && r>0)
	{
		  p=r-1000;
		  if (p<0) break;
		  i=0;t=0;nr=0;
		  while (i<n)
		  {
				i++;
				if (t+a[i]<=p)
				   t=t+a[i];
				else
				{
					nr++;
					t=0;
					i--;
				}
		  }
		  nr++;
		  if (nr==k) r=r-1000;
		  else q=0;
	}
	q=1;
	while (q && r>0)
	{
		  p=r-1;
		  if (p<0) break;
		  i=0;t=0;nr=0;
		  while (i<n)
		  {
				i++;
				if (t+a[i]<=p)
				   t=t+a[i];
				else
				{
					nr++;
					t=0;
					i--;
				}
		  }
		  nr++;
		  if (nr==k) r=r-1;
		  else q=0;
	}
	printf("%ld",r);
	return 0;
}