Cod sursa(job #518688)

Utilizator radubbRadu B radubb Data 2 ianuarie 2011 19:35:30
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
using namespace std;

#define nmax 16001
int n, k, valmin, valmax, sol;
int st[nmax];

void citire()
{
	int val, vf;
	freopen("transport.in","r",stdin);
	scanf("%d %d", &n, &k);
	vf=n;
	for(int i=1; i<=n; i++)
	{
		scanf("%d", &st[vf--]);
		if(st[vf+1] > valmin)
			valmin = st[vf+1];
		valmax += st[vf+1];
	}
}

inline void afisare()
{
	freopen("transport.out","w",stdout);
	printf("%d", sol);
}


int solve(int mij)
{
	int val, vf, suma, drum, salt;
	bool ok;

	vf = n; suma = mij; drum = 1; salt =0; ok = 1;
	while(vf)
	{
		if(st[vf] <= suma)
		{
			suma -= st[vf];
			salt++; 
		}
		else
		{
			if(!salt)
			{
				ok = 0;
				break;
			}
			else
			{
				drum++; salt = 0; vf++;
				suma = mij;
			}
		}
		vf--;
	}
	if(!vf && drum<=k)
		return 1;
	return 0;
}

void bs(int st, int dr)
{
	int mij;
	while(st <= dr)
	{
		mij = st+(dr-st)/2;
		if(solve(mij))
		{
			sol = mij;
			dr = mij-1;
		}
		else
			st = mij+1;
	}
}


int main()
{
	citire();
	bs(valmin, valmax);
	afisare();
	return 0;
}