Cod sursa(job #203079)

Utilizator AndreyPAndrei Poenaru AndreyP Data 13 august 2008 15:41:40
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.8 kb
#include<stdio.h>
int n,k,ultima,rez=1<<30;
int v[16005];
int caut(int x)
{
	int p=ultima+1,u=n,m;
	while(p<u)
	{
		m=(p+u)>>1;
		if(x<v[m])
			u=m;
		else
			p=m+1;
	}
	if(v[p]>x)
		p--;
	if((v[p+1]<x)&&(p<n))
		p++;
	return p;
}
bool vezi(int x)
{
	ultima=0;
	for(int i=1; (i<=k)&&(ultima!=n); i++)
		ultima=caut(x+v[ultima]);
	if(ultima==n)
		return true;
	return false;
}
int main()
{
	freopen("transport.in","r",stdin);
	freopen("transport.out","w",stdout);
	scanf("%d%d",&n,&k);
	int p=-5,u,m;
	for(int i=1; i<=n; i++)
	{
		scanf("%d",&v[i]);
		if(v[i]>p)
			p=v[i];
		v[i]+=v[i-1];
	}
	u=v[n];
	//if(vezi(u))
	//	rez=u;
	while(p<u)
	{
		m=(p+u)>>1;
		if(vezi(m))
		{
			if(m<rez)
				rez=m;
			u=m;
		}
		else
			p=m+1;
	}
	printf("%d\n",rez);
	return 0;
}