Cod sursa(job #1452151)

Utilizator theprdvtheprdv theprdv Data 20 iunie 2015 05:38:57
Problema Transport Scor 40
Compilator c Status done
Runda Arhiva de probleme Marime 0.9 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#define MAX(x, y) ((x) > (y) ? (x) : (y))

int N, K, max, _K, X[16001], LOG;

int check(int val){
	int step, k = 0, sum = 0, _k = 0;
	while (k != N && _k < K){
		for (step = LOG; step; step >>= 1)
			if (k + step > N) continue;
			else if (X[k + step] - sum <= val) k += step;
		sum = X[k], ++_k;
	}
	if (k < N) return -1;
	if (_k < K) return 1;
	return 0;
}

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

	scanf("%d %d", &N, &K);
	for (int i = 1; i <= N; ++i)
		scanf("%d", &X[i]),
		max = MAX(max, X[i]),
		X[i] += X[i - 1];
	for (LOG = 1; LOG < +N; LOG <<= 1);

	l = max, r = X[N];
	do{
		m = (l + r) >> 1;
		_K = check(m);
		if (_K < 0) l = m;
		else r = m + 1;
	} while (_K);

	while (!check(--m));
	printf("%d", ++m);

	return 0;
}