Cod sursa(job #408954)

Utilizator cristiprgPrigoana Cristian cristiprg Data 3 martie 2010 12:57:15
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.88 kb
#include <cstdio>
#include <algorithm>
using namespace std;
#define DIM 16005

int n, k, st[DIM], minim = 1<<30;

inline int min(int a, int b){return a<b?a:b;}

int nr_drumuri(int c)
{
	if (c < minim)	return (1<<30);
	
	int nr = 0, s = 0;
	for(int i = 1; i <= n; ++i)
	{
			
		if (s + st[i] == c)
			++nr, s = 0;
		else
			if (s + st[i] < c)
			s += st[i];
			else
				if (s + st[i] > c)
					++nr, s = st[i];
		
		
	}
	if (s)
		++nr;
	
	return nr;
}

int caut(int min, int max)
{
	while (min < max)
	{
		int c = (min+max)/2, nr = nr_drumuri(c);
		if (nr <= k)
			max = c;
		else
			min = c+1;
	}
	
	return max;
}

int main()
{
	FILE *f = fopen("transport.in", "r");
	fscanf(f, "%d%d", &n, &k);
	int S = 0;
	for (int i = 1; i <= n; ++i)	fscanf(f, "%d", &st[i]) , S += st[i], minim=min(minim, st[i]);
	fclose(f);
	f = fopen("transport.out", "w");
	
	fprintf(f, "%d\n", caut(minim,S));

	return 0;
}