Cod sursa(job #895109)

Utilizator andrici_cezarAndrici Cezar andrici_cezar Data 27 februarie 2013 09:58:31
Problema Transport Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.84 kb
#include <cstdio>

int N, K, a[16001], s;

inline int maxim(int x, int y) {
	return (x<y)?y:x;
}

bool merge(int x) {
	int nr = 1, k = 0;
	for (int i = 1; i <= N; ++i) {
		if (k + a[i] <= x) {
			k += a[i];
		} else if (a[i] > x) {
			return false;
		} else {
			k = a[i];
			++nr;
		}
	}
	
	if (nr <= K) {
		return true;
	}
	return false;
}

int cauta_binar(int st, int dr) {
	int logN, lg, i;
	for (logN = 1; logN <= dr; logN <<= 1);
	
	for (i = dr, lg = logN; lg; lg >>= 1) {
		if (i - lg > st-1 && merge(i-lg)) {
			i -= lg;
		}
	}
	return i;
}


int main() {
	freopen("transport.in", "r", stdin);
	freopen("transport.out", "w", stdout);
	
		scanf("%d %d", &N, &K);
		
		for (int i = 1; i <= N; ++i) {
			scanf("%d", &a[i]);
			s += a[i];
		}
		
		printf("%d\n", cauta_binar(s/K, s));
	
	return 0;
}