Cod sursa(job #781982)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 25 august 2012 15:55:30
Problema Transport Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb

#include <cstdio>

const unsigned int MAX_SIZE(16000);

unsigned int volume [MAX_SIZE];

unsigned int n, k;

inline bool check (unsigned int try_volume)
{
	unsigned int iterator(0), sum, transports(0);
	while (iterator < n)
	{
		sum = 0;
		while (iterator < n && sum + volume[iterator] <= try_volume)
		{
			sum += volume[iterator];
			++iterator;
		}
		if (!sum)
			return false;
		++transports;
	}
	if (transports <= k)
		return true;
	return false;
}

inline unsigned int search (unsigned int left, unsigned int right)
{
	unsigned int middle;
	while (left < right)
	{
		middle = (left + right) >> 1;
		if (check(middle))
			right = middle - 1;
		else
			left = middle + 1;
	}
	return left;
}

int main (void)
{
	std::freopen("transport.in","r",stdin);
	std::freopen("transport.out","w",stdout);
	std::scanf("%u %u",&n,&k);
	unsigned int *iterator(volume), *end(volume + n), total_volume(0);
	do
	{
		std::scanf("%u",iterator);
		total_volume += *iterator;
		++iterator;
	}
	while (iterator < end);
	std::fclose(stdin);
	unsigned int min_charge(search(0,total_volume));
	std::printf("%u\n",min_charge);
	std::fclose(stdout);
	return 0;
}