Cod sursa(job #448633)

Utilizator SmarandaMaria Pandele Smaranda Data 4 mai 2010 11:00:47
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include<stdio.h>
long x[16001];
long sp[16002];
int main()
{
	long n,k,i,m,min=1000000000,nk,s=0,vs,st,dr,min2,ok=1;
	
	freopen("transport.in","r",stdin);
	freopen("transport.out","w",stdout);
	
	scanf("%ld%ld",&n,&k);
	for (i=1;i<=n;i++)
		{
			scanf("%ld",&x[i]);
			sp[i]=sp[i-1]+x[i];
		}
	st=1;
	dr=sp[n];
	min2=min;
	sp[n+1]=sp[n]+10;
	while (st<=dr)
	{
		m=(st+dr)/2;
		nk=0;
		s=0;
		vs=0;
		ok=1;
		for (i=1;i<=n && ok;i++)
			if (x[i]>m)
				ok=0;
		if (ok)
		{
		for (i=1;i<=n;i++)
		{
			if (sp[i]-vs>m)
			{
				nk++;
				vs=sp[i-1];
			}
		}
		nk++;
		}
		if (sp[n]-vs>m)
			nk=0;
		if (nk<=k && nk)
		{
			if (m<min)
				min=m;
			dr=m-1;
		}
		else
			{				st=m+1;}
	}
	if (min==min2)
		printf("%ld\n",sp[n]);
	else
	printf("%ld\n",min);
	return 0;
}