Cod sursa(job #92490)

Utilizator tvladTataranu Vlad tvlad Data 15 octombrie 2007 19:07:11
Problema Transport Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <cstdio>

const int N = 16000;

int n,k;
int a[N];
int s,f;

int t ( int c ) {
	if (c < s) return 0x3f3f3f3f;
	int tr = 1, free = c;
	for (int i = 0; i < n; ++i) {
		if (free >= a[i]) {
			free -= a[i];
		} else {
			++tr;
			free = c;
			--i;
		}
	}
	if (free == c) --tr;
	return tr;
}

int bs ( int a, int b ) {
	if (b-a > 1) {
		if (t((a+b)/2) >= k)
			return bs((a+b)/2,b); else
			return bs(a,(a+b)/2-1);
	} else {
		if (t(a) <= k) return a; else return b;
	}
}

int main() {
	freopen("transport.in","rt",stdin);
	freopen("transport.out","wt",stdout);

	scanf("%d %d",&n,&k);
	s = -0x3f3f3f3f;
	f = 0;
	for (int i = 0; i<n; ++i) {
		scanf("%d",&a[i]);
		if (s < a[i]) s = a[i];
		f += a[i];
	}
	int c = bs(0,f);
	printf("%d\n",c);
	return 0;
}