Cod sursa(job #64764)

Utilizator peanutzAndrei Homorodean peanutz Data 5 iunie 2007 15:02:25
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.85 kb
#include <stdio.h>

#define NMAX 16005

int n, k;
int g[NMAX];
int st, dr;
int keep = -1;

void read()
{
	int i;
	scanf("%d %d\n", &n, &k);
	for(i = 0; i < n; ++i)
		scanf("%d", g+i), dr += g[i], st = (st < g[i]) ? g[i] : st;
}

int verify(int m)
{
	int nr, crt;
	int i;

	for(i = crt = 0, nr = 1; i < n; ++i)
	{
		if(crt + g[i] > m)
		{
			crt = g[i];
			++nr;
		}
		else
		{
			crt += g[i];
		}
		if(nr > k)
			return 0;
	}
	return 1;
}

void search()
{
	int m;

	dr += st;

	while(st <= dr)
	{
		m = (st + dr)/2;

		if(verify(m))
		{
			keep = m;
			dr = m-1;
		}
		else
		{
			st = m+1;
		}
	}
}

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

	read();

	search();

	printf("%d\n", keep);

	fclose(stdin);
	fclose(stdout);

	return 0;
}