Cod sursa(job #595203)

Utilizator GulyanAlexandru Gulyan Data 11 iunie 2011 14:56:56
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#define _CRT_SECURE_NO_WARNINGS

#include <cstdio>
#include <cstdlib>

using namespace std;

//#define DEBUG

#ifdef DEBUG
#define dprintf(...) fprintf(stderr, __VA_ARGS__)
#else
#define dprintf(...) do{}while(0)
#endif

int n, k;
int s[16001];

static int verifica(int x) {
	int sum = 0;
	int nr = 0;
	for(int i = 0; i < n; ++i) {
		if(sum + s[i] > x) {
			sum = s[i];
			nr++;
		}
		else
			sum += s[i];
	}
	return nr < k;
}

int main() {

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

	scanf("%d %d", &n, &k);

	int sum, max;
	sum = 0;
	max = -1;

	for(int i = 0; i < n; ++i) {
		scanf("%d", s + i);
		sum += s[i];
		max = max < s[i] ? s[i] : max;
	}

	dprintf("%d %d\n", sum, max);

	int left = max;
	int right = sum;
	int mid;
	int incap;
	int best = 0;

	while(left <= right) {
		mid = left + (right - left) / 2;
		incap = verifica(mid);
		dprintf("mid=%d v=%d\n", mid, incap);
		if(incap == 0) {
			left = mid + 1;
		}
		else {
			best = mid;
			right = mid - 1;
		}
	}

	printf("%d\n", best);
	dprintf("%d %d\n", best, verifica(best));

	fclose(stdout);
	return 0;
}